3

二进制角度剖析位运算(未完成)

 2 years ago
source link: https://segmentfault.com/a/1190000040713393
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

正负数表示:

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,>31位会被忽略
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 忽略31位以上,相当于
1_0000000 00000000 00000000 00000000 << 1
1_0000000 00000000 00000000 00000000 // 0

1_1-1000000 00000000 00000000 00000000// -3221225472,<<1 忽略31位以上,相当于
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

位与(|)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK