M插入N,使得M从N的第j位开始,到第i位结束

/**

 * 功能:给定两个32位的整数N与M,以及表示比特位置的i与j。编写一个方法,将M插入N,使得M从N的第j位开始,

 * 到第i位结束。假定从j为到i位足以容纳M,也即若M=10011,那么j和i之间至少可以容纳5个位。例如,不可能出现j=3

 * 和i=2的情况,因为第3位和第2位之间放不下M。

 */

 

x & (~0  << n):相当于把x最右边的n位清零

还有一些:(0s,1s表示一串0和一串1)

x ^ 0s = x

x ^ 1s = ~x

x ^ x = 0

 

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.     }

转载于:https://my.oschina.net/u/2822116/blog/790369

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值