1. 程式人生 > >位元位操作——更新二進位制

位元位操作——更新二進位制

轉自: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);
	}

}