说明:“_”左侧的最高位为状态位,“-”左侧会被位运算忽略

正负数表示:

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

位与(|)


呵sever
457 声望5 粉丝

程序打字员;code typist;コードタイピスト;


引用和评论

0 条评论