/**
例如:int i = 1; i占用 4 字节,1字节 = 8bit, 32位,bit(正整数 = 00000000 00000000 00000000 00000001 负数=11111111 11111111 11111111 11111111)
数字(num) bit
1 ====== 1
2 ====== 10
3 ====== 11
4 ====== 100
5 ====== 101
6 ====== 110
7 ====== 111
8 ====== 1000
9 ====== 1001
10 ====== 1010
11 ====== 1011
12 ====== 1100
13 ====== 1101
14 ====== 1110
15 ====== 1111
16 ====== 10000
... ====== ...
2147483632 ====== 1111111111111111111111111110000
2147483633 ====== 1111111111111111111111111110001
2147483634 ====== 1111111111111111111111111110010
2147483635 ====== 1111111111111111111111111110011
2147483636 ====== 1111111111111111111111111110100
2147483637 ====== 1111111111111111111111111110101
2147483638 ====== 1111111111111111111111111110110
2147483639 ====== 1111111111111111111111111110111
2147483640 ====== 1111111111111111111111111111000
2147483641 ====== 1111111111111111111111111111001
2147483642 ====== 1111111111111111111111111111010
2147483643 ====== 1111111111111111111111111111011
2147483644 ====== 1111111111111111111111111111100
2147483645 ====== 1111111111111111111111111111101
2147483646 ====== 1111111111111111111111111111110
2147483647 ====== 1111111111111111111111111111111
*/
/**
* 正整数位移规律
* 1:int 正数 max(2147483647=(1 << 31) -1) bit = 1111111111111111111111111111111(31位),如果为32位,bit=10000000000000000000000000000000(32位,是负数),
* min(1) bit=00000000000000000000000000000001(31位),高位的0被省略了,所以才31位。
* 2: 参考数字(1,2,3,4,5,6):bit 正数最高位为0(正数), 负数最高位为1(负数)
* 3: 参考数字(1,2,3,4,5,6):bit 奇数 bit 低位=1, 偶数 bit 低位=0,加法算法规律,bit低位逢1高位补1,低位变0,逢0变1
* 4: 参考数字(2,4,8,16):1 << n, bit = 1 + n个0, 1 >> bit = 1- n个0
* 5: 参考数字(1,3,7,15):(1 << n)-1, num * 2 + 1的数字bit位都是1。
*
* 6: 或(|): 0 | 0 =0,
* 1 | 0 = 1,
* 1 | 1 = 1。如果相同位有一个位为1,则为1,否则为0。
* int num = (1 << n)-1, n < num, 那么num | n = num。 当(1 << n)-1与任何与它小的数字进行异或操作,结果为(1 << n)-1。
* int num = (1 << n)-1, n > num, n必须再(2 << n)-1范围。那么num | n = (2 << n)-1 。 当(1 << n)-1与任何与它小的数字进行异或操作,结果为(2 << n)-1。
* 注意:只有(1 << n)-1满足这个规律。
* 7: 与(&): 0 & 0 = 0,
* 1 & 0 = 0,
* 1 & 1 = 1, 如果相同位都为1,则为1,否则为0。
* int num = (1 << n)-1, n < num, 那么num & n = n。 当(1 << n)-1与任何与它小的数字进行异或操作,结果为n。
* int num = (1 << n)-1, n > num, 那么num & n = (0-num)范围 。
* 注意:只有(1 << n)-1满足这个规律。
* 8: 异或(^): 1 ^ 0 = 1,
* 0 ^ 0 = 0,
* 1 ^ 1 = 0, 两个位必须不相同
* 9: 取反(~): ~7 = -8,
* ~5 = -6,
* ~6 = -7,所有的正数变负数,因为高位为0,取反为1,变负数。
*/