负数在内存中是用补码表示,顾名思义就是和其对应的正数相补
比如-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次方,和原值是不想等的