負數在內存中是用補碼表示,顧名思義就是和其對應的正數相補
比如-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次方,和原值是不想等的