位运算简介
从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
位运算概览
按位与运算符(&)
运算规则
对二进制数进行“与”运算,只有当两个二进制位都为1时,结果才为1,否则为0
0&0=0 0&1=0 1&0=0 1&1=1
按位与的用途
-
清零
如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
二进制情况下 10010001000101 & 00000000000000 = 0 十进制情况下 9285 & 0 = 0 注 9285的二进制是10010001000101 -
取一个数的指定位
比如取数 X=10010001000101 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00000000001111,然后将X与Y进行按位与运算(X&Y=00000000000101)即可得到X的指定位。
二进制 10010001000101 & 00000000001111 = 00000000000101 十进制 9285 & 15 = 5 注 9285的二进制是10010001000101 15的二进制是00000000001111 -
判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数
按位或运算符(|)
运算规则
对二进制数进行“或”运算,只要有一个二进制位为1,结果就为1,否则为0
0|0=0 0|1=1 1|0=1 1|1=1
按位或运算符用途
-
将一个数据的某些位设置为1
比如将数 X=10010001000101 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00000000001111,然后将X与Y进行按位或运算(X|Y=10010001001111)即可得到
二进制 10010001000101 | 00000000001111 = 10010001001111 十进制 9285 | 15 = 9295 注 9285的二进制是10010001000101 15的二进制是00000000001111
异或运算符(^)
运算规则
对二进制数进行“异或”运算,如果两个二进制位相同,则结果为0,否则为1
0^0=0 0^1=1 1^0=1 1^1=0
性质
-
交换律
a ^ b = b ^ a
-
结合律
(a ^ b) ^ c == a ^ (b ^ c)
-
对于任何数x,都有 x ^ x = 0,x ^ 0 = x
-
自反性
a ^ b ^ b = a ^ 0 = a
异或运算符用途
-
交换两个数
二进制 a = 10010001000101 二进制 b = 00000000001111 十进制 a = 9285 十进制 b = 15 a = a ^ b b = b ^ a a = a ^ b -
与0相异或值不变
二进制 a = 10010001000101 二进制 b = 00000000001111 十进制 a = 9285 十进制 b = 15 a ^ 0 = 10010001000101 b ^ 0 = 00000000001111 -
翻转指定位
比如将数 X=10010001000101 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到
二进制 10010001000101 ^ 00000000001111 = 10010001001010 十进制 9285 ^ 15 = 9290 注 9285的二进制是10010001000101 15的二进制是00000000001111
取反运算符(~)
运算规则
对一个二进制数进行“非”运算,将0变为1,将1变为0
~1 = 0
~0 = 1
取反运算符用途
-
取反
二进制 ~1 = 0 二进制 ~0 = 1
左移运算符(<<)
运算规则
将一个二进制数向左移动指定的位数,右边用0填充
二进制 a = 10101110
a << 2
二进制 a = 10111000
左移运算符用途
-
一个数乘以移位的位数乘以二,例如左移两位则将该数乘以两次二
十进制 15 << 2 = 60
右移运算符(>>)
运算规则
将一个二进制数向右移动指定的位数,左边用符号位填充
二进制 a = 10101110
a >> 2
二进制 a = 00101011
十进制 174 >> 2 = 43
二进制 b = -10101110
b >> 1
二进制 b = -1010111
十进制 -174 >> 1 = -87