负数在内存中是用补码表示,顾名思义就是和其对应的正数相补

比如-2:

1111111……1110

和2相加正好溢出,也就是互补

比如~5取反:

5是0000000……00101

取反:1111111111……11010

这个数值和6正好互补,所以~5的值是-6

 

再比如,判断一个int值a是2的次方,除了判断a & (a-1) == 0 ,

可以通过这样:a & -a == a

先看充分性,2的n次方的形式都是

000……00010……0

这样,补码都是

111……11110……0这样

相与是和原值相等,

再看必要性,如果不是000……001000……00这种只有一位上有1的,而是多于一个位数上是1,比如随便找个位数

000^00100100,那么它的补码就是

111^11011100,相与就是最低位上的2的n次方,和原值是不想等的