位元位操作——更新二進位制
阿新 • • 發佈:2019-01-06
轉自:http://blog.csdn.net/shinanhualiu/article/details/49027891 (文中有一處筆誤已修改)
給出兩個32位的整數N和M,以及兩個二進位制位的位置i和j。寫一個方法來使得N中的第i到j位等於M(M會是N中從第i為開始到第j位的子串)
樣例
給出N = (10000000000)2,M = (10101)2, i = 2, j = 6
返回 N = (10001010100)2
挑戰
最少的操作次數是多少?
solution: 題目的意思就是講N的第i到j位換成M,因此,我們可以先將N的i到j位清零和把M向左移動i位,然後將N與上M就是所求的答案。
將某個位清零,則將該位與此位元位上為0的二進位制字串相與,而其他位不變的話,二進位制字串的其他位應該為1;而這樣的二進位制字串可以由1左移到相應的位置取反後得到。
public class UpdateBits { //法一:時間複雜度為O(j-i) public int updateBits(int n, int m, int i, int j){ for(int pos=i;pos<=j;++pos) n &= ~(1<<pos); m <<= i; return n|m; } //法二:時間複雜度為O(1) public int updateBits_2(int n, int m, int i, int j){ int ones = ~0; //將所有位置置1 int mask; if(j<31){ mask = ones<<(j+1); //將0到j位都置為0 mask |= ((1<<i)-1); //將i到j位置置為0,其餘位為1 } else{ mask = ((1<<i)-1); //此時j=32; } return (n & mask)|(m << i); } }