/**
* 功能:给定两个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
- 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;
- }