- 获取某个数无前导位的的最大全1数目
int tmp = 1;
while(tmp < target) {
tmp <<= 1;
tmp += 1;
}
- 0^b = b
- 异或重要特性:不进位加法
- 判断一个数是否为全1 (n+1)&n==0
- n&n-1 会将n的最低位1变成0,其余不变,很容利用这个方式计算出一个数里面的1的数目:
int hammingWeight(uint32_t n) {
int sum = 0;
while (n != 0) {
sum++;
n &= (n - 1);
}
return sum;
}
原码 反码 补码
- 正数的原码、反码、补码就是本身
- 负数的反码是原码符号位不变,其余为取反,补码是在反码的基础上加1,所以8位的-1是10000001 -> 11111110 -> 11111111,如果转成无符号的值就是最大的值。
- c++中的值是以补码的形式存在的。(所有的编程语言都是?)
- 为什么需要补码?
- 因为可以用加法来实现减法,这样计算机的基础电路设计就可以统一。(两个分支可能是两种规则,但是从更高层的角度来看问题,其实可以用一个规则就能概括这两种规则。)
- 范围是奇数,并且可表示的最低位多一位数。