常见位运算总结
1. 基础位运算
<< 左移,右边填充0, 每左移一次, 相当于数字乘以2
>> 右移, 左边填充0(正数) ,负数(保持符号位),相当于数字除2
~按位取反, 反转整数每一位, 从而得到和原数值相反数
& 有0就是0
I 有1就是1
^ 相同为0, 相异为1/无进位相加
2. 给定一个数n, 确定它的二进制表示中的第x为是0还是1
约定从低位开始
先让n右移x为,再&上一个1, 如果是1就返回1, 如果是0,就返回0. 正好和之前的值是一 一对应的关系
我们&1之后,其他位的结果都是0,我们只考虑最低位即可
运算符优先级, 能加括号就+括号,因此上面的操作 (n>>x)&1
3. 将一个数n的二进制表示第x位修改为1
对x位按位或上一个1,其他位或上0
获得这么一个数, 就需要让1<<x位, 然后 n = n |(1<<x)
4. 将一个数n的二进制表示的第x位修改成0
将第x位&上一个0,其他位&1(其余位保持不变)
我们获得这个数, 就是让1<<x位,然后取反
n = (~(1<<x))&n
5. 位图的思想
位图的本质: 就是一个哈希表
之前存信息int[]的哈希表
现在用int的二进制位来保存信息
此时我们用一个变量就可以实现增删查改
6. 提取一个数(n)二进制表示中最右侧的1(lowbit)
把最右边的1提取出来,其他位数都是0
n&-n -n是把最右侧的1, 左边区域全部变成相反的,然后&,左边的区域就是0,右边的区域-n的时候就变成0了
7. 干掉一个数(n)二进制表示中最右侧的1
干掉1, 表示把那一位变成0
n & (n -1) n-1的意思是一直往左边借位,知道遇到1为止,1本身被借走了,该位变成0, 右边的数都变成1,左边的区域不变.
6,7可以写,191,338,461题
8. 异或运算律
1. a ^ 0 = a
2. a^a=0
3. a^b^c = a^(b^c) -> 结合律
3, 我们用无进位相加来看, 相当于1的抵消
136, 260