说明:“_”左侧的最高位为状态位,“-”左侧会被位运算忽略
正负数表示:
0_0000000 00000000 00000000 00001001 // 9
1_0000000 00000000 00000000 00001001 // -9
// 实际上:
1_1111111 11111111 11111111 11110110 // 取反码
1_1111111 11111111 11111111 11110111 // 补码+1
0_0000000 00000000 00000000 00001010 // 10
1_1111111 11111111 11111111 11110110 // -10
// 超出31位
0_1-0000000 00000000 00000000 00000000 // 2147483648
1_1-0000000 00000000 00000000 00000000 // -2147483648
// 实际上:
1_0-1111111 11111111 11111111 11111111 // 取反码
1_1-0000000 00000000 00000000 00000000 // 补码+1,跟原本一样
加减
0_0000000 00000000 00000000 00000000 // 0
1_1111111 11111111 11111111 11111111 // 0 - 1
1_0000000 00000000 00000000 00000000 // 取反码
1_0000000 00000000 00000000 00000001 // 补码,结果-1
0_1111111 11111111 11111111 11111111 // 2147483647(4Byte最大值,java中int型最大值)
// 2147483647 + 1(-左边会被位运算会被忽略,详见位运算)
0_1-0000000 00000000 00000000 00000000 // 2147483648
位运算:
左移<<
// 正数左移
0_0000000 00000000 00000000 00001001 // 9
0_0000000 00000000 00000000 00010010 // 9 << 1 = 18,右侧补0
0_1111111 11111111 11111111 11111111 // 2147483647
1_1-1111111 11111111 11111111 11111110 // 2147483647 << 1 = -2,状态位变为1,同时出现32位
// 实际上:
1_1-1111111 11111111 11111111 11111101 // -1去掉补码
1_0-0000000 00000000 00000000 00000010 // 取反码,结果为-2
/* 左移后超过31位 */
0_1000000 00000000 00000000 00000000 // 1073741824
1_1-0000000 00000000 00000000 00000000 // 1073741824 << 1
// 实际上:
1_0-1111111 11111111 11111111 11111111 // -1去掉补码
1_1-0000000 00000000 00000000 00000000 // 取反码,结果为-2147483648
// 超过31位的左移
0_1-0000000 00000000 00000000 00000000 // 2147483648
0_0000000 00000000 00000000 00000000 // 2147483648 << 1 = 0,32位以上会被忽略
0_1-1000000 00000000 00000000 00000000 // 3221225472
1_1-000000 00000000 00000000 00000000 // 3221225472 << 1,结果和1073741824 << 1一样
// 负数左移
1_1111111 11111111 11111111 11110111 // -9
1_1111111 11111111 11111111 11101110 // -9 << 1 = -18
// 实际上
1_1111111 11111111 11111111 11101101 // -1去补码
1_0000000 00000000 00000000 00010010 // 取反码,结果为-18
1_1-0000000 00000000 00000000 00000000 // -2147483648,<<1 忽略32位以上,相当于
1_0000000 00000000 00000000 00000000 << 1
1_0000000 00000000 00000000 00000000 // 0
1_1-1000000 00000000 00000000 00000000// -3221225472,<<1 忽略32位以上,相当于
1_1000000 00000000 00000000 00000000 << 1
1_1-0000000 00000000 00000000 00000000// -2147483648
右移>>
0_0000000 00000000 00000000 00001001 // 9
0_0000000 00000000 00000000 00000100 // 9 >> 1,4
// 2147483648 >> 1
无状态右移>>>
0_0000000 00000000 00000000 00001001 // 9
0_0000000 00000000 00000000 00000100 // 9 >> 1,4
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。