看到*2,/2,+1,-1等运算应该第一时间想到二进制运算
X^1,等于将X取反
X^0,X不变。
i & (i-1)是否等于0,如果i是2的幂,说明仅某一位为1,其余均为0。
i & (i-1)将数字的二进制2表示最后一个1变为0
不同的进制只是一个数不同的表示方式而已,便于进行不同类型的操作。
2进制利于进行2的倍数相关的操作,十进制便于进行10的倍数相关的操作。
二进制表达相较与其它进制的优点,编程语言的二进制运算符。每位上只有两种可能1和0。
2的幂次:2^n,乘以2等于位运算左移一位.
lowbit操作
int lowbit(int x){
return x & (- x);
}
位运算枚举子集
for(int s2 = s;s2 != 0; s2 = s & (s2 - 1)){
}
枚举长度固定的子集
for(int s=(1<<r)-1;s<1<<n;){
//具体操作
int x=s&-s;
int y=s+x;
s=((s&~y)/x>>1)|y;
}
统计二进制中1的个数
count = 0
while(a){
a = a & (a - 1);
count++;
}