位运算【基本运算】

来源:互联网 发布:dns免费域名 编辑:程序博客网 时间:2024/06/08 02:58

上一篇中我们分析了位的定义,这一篇中我们分析一下位的基本运算

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

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static int getBit(int num, int i) {  
  2.     i = (1 << i);  
  3.     num = num & i;  
  4.     if (num == 0)  
  5.         return 0;  
  6.     return 1;  
  7. }  
也可以直接把这个数右移i位后和1做与运算

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static int getBit2(int num, int i) {  
  2.     return (num>>i)&1;  
  3. }  

6. 设位

设置第i位的方法:X|00000010 (i=1)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static int setBit(int num, int i) {  
  2.     i = 1 << i;  
  3.     return num | i;  
  4. }  


7. 清位

把第i位清0的方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static int clearBit(int num, int i) {  
  2.     i = 1 << i;  
  3.     i = ~i;  
  4.     num = num & i;  
  5.     return num;  
  6. }  

把最左边位到i位都清0的方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static int clearBitLtoI(int num, int i) {  
  2.     i = 1 << i + 1;  
  3.     i = i - 1;  
  4.     num = num & i;  
  5.     return num;  
  6. }  

把第i位到第1位都清0的方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static int clearBitItoR(int num, int i) {  
  2.     i = 1 << i + 1;  
  3.     i = i - 1;  
  4.     i = ~i;  
  5.     num = num & i;  
  6.     return num;  
  7. }  

8. 更新位

步骤:清位+设位

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static int updateBit(int num, int i, int w) {  
  2.     int temp = ~(1 << i);  
  3.     num = num & temp;  
  4.     w = w << i;  
  5.     num = num | w;  
  6.     return num;  
  7. }  

以上8种基本运算非常重要,每一位想要掌握位运算的朋友,上面的基本运算都需要非常熟练的掌握
0 0
原创粉丝点击