上一篇中我们分析了位的定义,这一篇中我们分析一下位的基本运算
1. 移动
左移n位:乘以2的n次方
右移n位:除以2的n次方
(~0)左移n位:在1后面加上n个0 (注:~0不等于1,等于11…11)
x&(~0<<n):将最右边的n位清零
正数左移右边补0
正数右移左边补0
负数左移右边补1
负数右移左边补1
移动的作用总结:乘2,除2,右n位清零
2. 异或
x^0=x
x^x=0
x^1=~x
x^~x=1
异或的作用总结:取数,清零,取非,清1
3. 且运算
x&0=0
x&1=x
x&x=x
且运算的作用总结:位清零,位取数,取数
4. 或运算
x|0=x
x|1=1
x|x=x
或运算的作用总结:位清1,取数。
5. 取位
先把1左移i位
再把num与i做“与运算”
如果是0返回0,否则返回1
- public static int getBit(int num, int i) {
- i = (1 << i);
- num = num & i;
- if (num == 0)
- return 0;
- return 1;
- }
也可以直接把这个数右移i位后和1做与运算
- public static int getBit2(int num, int i) {
- return (num>>i)&1;
- }
6. 设位
设置第i位的方法:X|00000010 (i=1)
- public static int setBit(int num, int i) {
- i = 1 << i;
- return num | i;
- }
7. 清位
把第i位清0的方法
- public static int clearBit(int num, int i) {
- i = 1 << i;
- i = ~i;
- num = num & i;
- return num;
- }
把最左边位到i位都清0的方法
- public static int clearBitLtoI(int num, int i) {
- i = 1 << i + 1;
- i = i - 1;
- num = num & i;
- return num;
- }
把第i位到第1位都清0的方法
- public static int clearBitItoR(int num, int i) {
- i = 1 << i + 1;
- i = i - 1;
- i = ~i;
- num = num & i;
- return num;
- }
8. 更新位
步骤:清位+设位
- public static int updateBit(int num, int i, int w) {
- int temp = ~(1 << i);
- num = num & temp;
- w = w << i;
- num = num | w;
- return num;
- }
以上8种基本运算非常重要,每一位想要掌握位运算的朋友,上面的基本运算都需要非常熟练的掌握