一、位运算的基础知识
1.1、基础位运算复习
<<:左移运算:将目标整数的二进制位左移x位,右边空出的位补0。
>>:有移运算:将目标整数的二进制位右移x位,左边补该补该目标整数的符号位。逻辑右移:左边补零。
~:按位取反:将目标二进制整数的二进制位进行安慰取反。
&:按位与运算:将两个整数的二进制位进行按位与只有两个二进制位的位全为1该位才为1,否则全为0。
|:按位或运算:将两个整数的二进制位进行按位或只有两个二进制位的位全为0该位才为0,否则全为1。
^:按位异或运算:将两个整数的二进制位进行按位异或只有两数的二进制位相同为0相异为1;或者这样理解:无进位相加。
1.2、一个整数的第x位是0还是1(位图)
举个例子:target:0110101001,x:3
解法:将target有移x位,然后&1得到的结果如果是0就是0,如果是1就是1。
target >> x=0000110101&1=1
所以第x位为1。
即将目标数右移x位后&1判断结果是0还是1即可。公式:
(target >> x) & 1
1.3、将一个整数的第x位修改成1(位图)
解法:target |= (1 << x)
1.3、将一个整数的第x位修改成0(位图)
解法:target &= (~(1 << x))
1.4、提取一个整数的最右侧的1(lowbit)
lowbit指的是将一个整数的二进制位的最右侧的1和1右侧的0全部进行保留,将该1左侧的数全部变成0。
公式:lowbit(x) = x & (-x)
解释:由于(-x)的补码一定是将x按位取反后再+1得到的所以最后一定是x的最右侧的1位置一定会变成0,当进行+1后改为会由于进位操作重新变成1,右侧的其余位全部为0,并且该为的左侧将全部为与x该位的左侧相反的,所以最终的结果一定是正确的。
举个例子:target:0110101001,x:3
-target=1110101001,补码:原码取反+1即1001010111
所以lowbit(target)=1
1.5、干掉一个数的最右侧的1
公式:n &= (n - 1)
1.6、异或运算的运算率
a ^ 0 = aa ^ a = 0(消消乐)a ^ b ^ c = a ^ (b ^ c)(交换率)
3117

被折叠的 条评论
为什么被折叠?



