• 获取某个数无前导位的的最大全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++中的值是以补码的形式存在的。(所有的编程语言都是?)
  • 为什么需要补码?
    • 因为可以用加法来实现减法,这样计算机的基础电路设计就可以统一。(两个分支可能是两种规则,但是从更高层的角度来看问题,其实可以用一个规则就能概括这两种规则。)
    • 范围是奇数,并且可表示的最低位多一位数。