与 &
- 最常见的题目: 识别二进制中数字的个数 n&(n-1)
- 检查数字是不是全为 1:
return tmp&(tmp+1)==0 Python需要(A & 0xffffffff)来应对负数:- 正常整形数在内存中是以 补码 的形式存放的,输出的时候也是 补码。
Python中负数输出是:在原码的二进制前面加上一个负号:bin(-3)=-0b11- 对于 bin(x)(x 为 十进制负数),输出的是它的原码的二进制表示加上一个负号
- 对于 bin(x)(x 为 十六进制负数),输出的是对应的二进制表示
- 所以需要先得到一个十六进制数,然后再转换为二进制
异或 ^
- 交替位二进制数
# 交替使得 1 0 相对tmp=n^(n>>1)# 检查数字是不是全为 1return tmp&(tmp+1)==0
原码、反码、补码
原码 + 反码相加的和是2**n-1Python 生成的原码
binNumberStr=bin(N)[2:]# 0b 111 bin(7)
利用原码求反码
class Solution {public:int bitwiseComplement(int N) {if(N==0){return 1;}int tmp1=1;int tmp2=N;while(tmp2>0){N^=tmp1;tmp1=tmp1<<1;tmp2=tmp2>>1;}return N;}};
class Solution {public:int bitwiseComplement(int N) {int tmp=2;while(tmp<=N){tmp<<=1;}return tmp-1 -N;}};
按位取反
Python 中 ~x = -(x+1) 原理:
- ~9
转二进制:0 1001
计算补码:0 1001
按位取反:1 0110
要知道它所表达的数是多少,需要转换为原码
末位加一:1 1010
符号位为1是负数,即 -10
- ~ -9
转二进制:1 1001
计算补码:1 0111
按位取反:0 1000
要知道它所表达的数是多少,需要转换为原码
正数的补码和原码相同,仍为:0 1000,即 8
组合
使用位运算计算加法:
- Step1: a^b,完成不进位加法
- Step2: a&b,完成进位的运算
- Step3: 把step2左移一位,模拟正常加法的向前进一位
class Solution {public:int add(int a, int b) {if(b==0){return a;}int step1=0,step2=0,step3=0;while(b!=0){step1=a^b;step2=a&b;step3=(unsigned int)step2<<1;a=step1;b=step3;}return step1;}};
- Step1: a^b,完成不进位加法
汉明距离
异或 和 number&(number-1) 就可以解决了
