M插入N,使得M從N的第j位開始,到第i位結束

/**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

 

  1. boolean getBit(int num, int i) {  
  2.         return ( (num & ( 1 << i )) != 0);  
  3.     }  


2. 將第i位置爲1,將1左移i位,獲得形如00001000的值,接着對這個num執行「位或」操做,這樣只會改變i位的數據,不會影響num的其他位

 

  1. boolean setBit(int num, int i) {  
  2.         return num | ( 1 << i );  
  3.     }  


3. 將第i位清零, 與setBit恰好相反, 將1左移i位,獲得形如00001000的值,再取反,獲得形如11110111的值,接着對這個num執行「位與」,這樣只會清零i位,不會影響num的其他位

 

  1. boolean clearBit(int num, int i) {  
  2.         return num & ~( 1 << i );  
  3.     }  

 

 

 將num的最高位至第i位清零:

 

  1. boolean clearBitMSthrough(int num, int i) {  
  2.         int mask = ~( ( 1 << i ) - 1);  
  3. return num & mask;  
  4.  } 

將最右邊的i位清零:

 

  1. boolean clearBitIthrough(int num, int i) {  
  2.         int mask = ~( ( 1 << ( i + 1 ) ) - 1 );  
  3.         return num & mask;  
  4.     }

代碼實現:

注意:M和N的輸入進制數

      [java] view plain copy

 

  1. public static void main(String[] args) {  
  2.     // TODO Auto-generated method stub    
  3.     String s1=Integer.toBinaryString(updateBits(1024, 19, 2, 6));  
  4.     System.out.println(s1);  
  5.       
  6.     String s2=Integer.toBinaryString(updateBits2(1024, 19, 2, 6));  
  7.     System.out.println(s2);  
  8. }  

 

兩種方法:

方法一:

    [java] view plain copy

 

  1. public static int updateBits(int n,int m,int i,int j){        
  2.         int mask=~(1<<(j+1)-1);  
  3.         for(int k=i-1;k>=0;k--){  
  4.             mask+=1<<k;  
  5.         }  
  6.         int result=n&mask|(m<<i);  
  7.           
  8.         return result;    
  9.     }  

 

 

方法二: [java] view plain copy

 

  1. public static int updateBits2(int n,int m,int i,int j){  
  2.         int allOnes=~0;  
  3.         int left=allOnes<<(j+1);  
  4.         int right=(1<<i)-1;  
  5.           
  6.         int mask=left|right;  
  7.           
  8.         int n_cleared=n&mask;  
  9.         int m_shifted=m<<i;  
  10.           
  11.         return n_cleared|m_shifted;  
  12.     }
相關文章
相關標籤/搜索