位操作:
(一)常见位操作:&(与 and),|(或,or),^(异或,xor)
如:
"1s"和"0s"分别表示一串1和一串0;
如:x^0s=x;
x&0s=0s x|0s=x
x^1s=~x; x&1s=x x|1s=1s
x^x=0 x&x=x x|x=x
注意:(1)位操作中所有的操作都是按位进行的,某一位的运算结果不会影响到其他位。
(2)上诉语句对某一位成立,同样适用于一串位。
-----------------
(二)&(与 and):
(1)相应位置0。
哪些位要置0,则找一个对应位为0的数,与之相与。
如:x & (~0<<n):将x的最右的n为置0.
1)步骤:
将1左移i位,得到形如00010000的值,然后对该值取反得到掩码。
掩码然后和num位与。
2)实现:
/*将num的第i为清0*/
int clearBit(int num ,int i){
int mask=~(1<<i);
return (num & mask);
}
/*
目的:将num的最高位到第i位清零。
分析:将最高位到第i位清零,只需要一个0到i-1位为1,其余位为0的数,(形如00011111)与之相与。
*/
int clearBitsMSBtoI(int num ,int i){
int mask=(1<<i)-1;
return (num & mask);
}
/*
目的:将num的0位到第i位清零。
分析:只需要将0位到第i为0,其余位为1的数,(形如11111000)与之相与即可。
*/
int clearBitsIto0(int num ,int i){
int mask=~(1<<(i+1)-1);
return (num & mask);
}
或者
int clearBitsIto0(int num ,int i){
return num& (~0 << i);
}
---
(2)获取第i位:getBit
1)步骤:
将1左移i位,然后和num位与。
2)实现:
/*取num的第i位*/
boolean getBit(int num ,int i){
return (num & (1<<i)!=0);
}
如:获取第5位,如将1左移5位,得到形如00010000,然后和num位与。
-----------------
(三)|(或,or):
(1)作用:
相应位置1。setBit
1)步骤:
先将1左移i位,得到形如00010000的值,然后该值与num执行位或。
2)实现:
/*将num的第i位置1*/
int setBit(int num ,int i ){
return (num | (1<<i) );
}
-----------------
(四)^(异或,xor):
(1)作用:
相应为取反。
(2)实现:
/*将第i位取反*/
int reverseBit(int num ,int i){
int mask=(1<<i);
return (num ^ mask);
}
---------