位运算介绍及应用

235 阅读4分钟

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。


##补码 在总结按位运算前,有必要先介绍下补码的知识,我们知道当将一个十进制正整数转换为二进制数的时候,只需要通过除2取余的方法即可,但是怎么将一个十进制的负整数转换为二进制数呢?其实,负数是以补码的形式表示,其转换方式,简单的一句话就是:先按正数转换,然后取反加1。

要将十进制的-10用二进制表示,先将10用二进制表示:
0000 0000 0000 1010
取反:
1111 1111 1111 0101
加1:
1111 1111 1111 0110
所以,-10的二进制表示就是:1111 1111 1111 0110

与(&)

与运算进行的是这样的算法: 0&0=0,0&1=0,1&0=0,1&1=1

将10与-10进行按位与(&)运算:
  0000 0000 0000 1010
& 1111 1111 1111 0110
-----------------------
  0000 0000 0000 0010
所以:10 & -10 = 0000 0000 0000 0010

应用:判断奇数偶数

(((nums&1)==0)?"偶数":"奇数")

非(~)(取反)

非运算即取反运算,在二进制中1变0,0变1

对10进行取反(~)运算:
& 0000 0000 0000 1010
---------------------
  1111 1111 1111 0101
所以:~10 = 1111 1111 1111 0101

或(|)

只要相应位上存在1,那么该位就取1,均不为1,即为0。

将10与-10进行按位或(|)运算:
  0000 0000 0000 1010
| 1111 1111 1111 0110
-----------------------
  1111 1111 1111 1110
所以:10 | -10 = 1111 1111 1111 1110

异或(^)

只有当相应位上的数字不相同时,该为才取1,若相同,即为0。

将10与-10进行按位异或(^)运算:
  0000 0000 0000 1010
^ 1111 1111 1111 0110
-----------------------
  1111 1111 1111 1100
所以:10 ^ -10 = 1111 1111 1111 1100

应用:交换两个数

a = a ^ b;
b = b ^ a;
a = a ^ b;

##左移(<<) 用来将一个数各二进制位全部向左移动若干位。

对10左移1位(就相当于在右边加1个0):
0000 0000 0000 1010
--------------------
0000 0000 0001 0100
所以:10 << 1 = 0000 0000 0001 0100 = 20

注意,观察可以发现,左移一位的结果就是原值乘2,左移两位的结果就是原值乘4。 ##右移(>>) 用来将一个数各二进制位全部向右移动若干位。

对10右移1位(就相当于在左边加1个0):
0000 0000 0000 1010
--------------------
0000 0000 0000 0101
所以:10 >> 1 = 0000 0000 0000 0101 = 5

注意,观察可以发现,右移一位的结果就是原值除2,左移两位的结果就是原值除4,注意哦,除了以后没有小数位的,都是取整。