什么是位运算?
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。
位运算的操作数是整数类型或字符型。
位运算符:
|(or) 或运算
通常用于二进制特定位上的无条件赋值,例如一个数 or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了。
&(and) 与运算
通常用于位运算的取位操作,例如一个数and 1,相当于取这个数最末位。
一个位and 0,相当于将这个位置零。
结合起来用,可将特定位置零。
^(xor) 按位异或
相异为真
通常用于特定位取反。如 xor 1
xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即
(a xor b) xor b = a。
xor运算可以用于简单的加密。
~(not) 按位取反
如果not的对象是无符号整数(不能表示负数),那么得到的值就是它与该类型上界的差。
<<(shl) 左移运算符
二进制位向左移动,右边补0
相当于数字大小乘2
>>(shr) 右移运算符
二进制位向右移动,左边在数字为正是用0补齐,在数字为负时用1补齐
相当于数字大小除2
简单常用例题:
去掉最后一位 | (101101->10110) |
x >> 1
在最后加一个0 | (101101->1011010) |
x << 1
在最后加一个1 | (101101->1011011) |
x << 1 ^ 1
把最后一位变成1 | (101100->101101) |
x | 1
把最后一位变成0 | (101101->101100) |
x & 0
最后一位取反 | (101101->101100) |
x ^ 1
把右数第k位变成1 | (101001->101101,k=3) |
x | (1 << k - 1)
把右数第k位变成0 | (101101->101001,k=3) |
x | (1 << k -1) ^ (1 << k -1)
x &~ (1 << k - 1)
右数第k位取反 | (101001->101101,k=3) |
x ^ (1 << k - 1)
取末三位 | (1101101->101) |
x & 7
取末k位 | (1101101->1101,k=4) |
x & (1 << k ) - 1
取右数第k位 | (1101101->1,k=4) |
(x & (1 << k - 1)) >> k - 1
(x >> (k-1)) & 1
把右边连续的1变成0 | (100101111->100100000) |
x & (x + 1)
把右起第一个0变成1 | (100101111->100111111) |
x | (x + 1)
把右边连续的0变成1 | (11011000->11011111) |
x | (x - 1)