/**java
* 功能:給定兩個32位的整數N與M,以及表示比特位置的i與j。編寫一個方法,將M插入N,使得M從N的第j位開始,app
* 到第i位結束。假定從j爲到i位足以容納M,也即若M=10011,那麼j和i之間至少能夠容納5個位。例如,不可能出現j=3spa
* 和i=2的狀況,由於第3位和第2位之間放不下M。.net
*/blog
x & (~0 << n):至關於把x最右邊的n位清零ip
還有一些:(0s,1s表示一串0和一串1)get
x ^ 0s = xflash
x ^ 1s = ~xit
x ^ x = 0io
x & 0s = 0
x & 1s = x
x & x = x
x | 0s = x
x | 1s = 1
x | x = x
常見的位操做:獲取,設置, 清楚以及更新位數據
1. 獲取某一位是1仍是0:
將1左移i位,獲得形如00001000的值,而後對這個值與num執行「位與」操做,從而將i位以外的的左右位清零,最後,檢查該結果是否爲0 ,爲0,說明i位爲0,不然說明i位爲1
- boolean getBit(int num, int i) {
- return ( (num & ( 1 << i )) != 0);
- }
2. 將第i位置爲1,將1左移i位,獲得形如00001000的值,接着對這個num執行「位或」操做,這樣只會改變i位的數據,不會影響num的其他位
- boolean setBit(int num, int i) {
- return num | ( 1 << i );
- }
3. 將第i位清零, 與setBit恰好相反, 將1左移i位,獲得形如00001000的值,再取反,獲得形如11110111的值,接着對這個num執行「位與」,這樣只會清零i位,不會影響num的其他位
- boolean clearBit(int num, int i) {
- return num & ~( 1 << i );
- }
將num的最高位至第i位清零:
- boolean clearBitMSthrough(int num, int i) {
- int mask = ~( ( 1 << i ) - 1);
- return num & mask;
- }
將最右邊的i位清零:
- boolean clearBitIthrough(int num, int i) {
- int mask = ~( ( 1 << ( i + 1 ) ) - 1 );
- return num & mask;
- }
代碼實現:
注意:M和N的輸入進制數
[java] view plain copy
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- String s1=Integer.toBinaryString(updateBits(1024, 19, 2, 6));
- System.out.println(s1);
-
- String s2=Integer.toBinaryString(updateBits2(1024, 19, 2, 6));
- System.out.println(s2);
- }
兩種方法:
方法一:
[java] view plain copy
- public static int updateBits(int n,int m,int i,int j){
- int mask=~(1<<(j+1)-1);
- for(int k=i-1;k>=0;k--){
- mask+=1<<k;
- }
- int result=n&mask|(m<<i);
-
- return result;
- }
方法二: [java] view plain copy
- public static int updateBits2(int n,int m,int i,int j){
- int allOnes=~0;
- int left=allOnes<<(j+1);
- int right=(1<<i)-1;
-
- int mask=left|right;
-
- int n_cleared=n&mask;
- int m_shifted=m<<i;
-
- return n_cleared|m_shifted;
- }