5: 原码:0 0000000 00000000 00000000 00000101 反码:0 0000000 00000000 00000000 00000101 补码:0 0000000 00000000 00000000 00000101 -5: 原码:1 00000000 00000000 00000000 00000101 反码:1 1111111 11111111 11111111 11111010 补码:1 1111111 11111111 11111111 11111011
5<<1 原码:0 0000000 00000000 00000000 00000101 左移1位:0 0000000 00000000 00000000 00001010 即:10 -5<<1 原码:1 00000000 00000000 00000000 00000101 补码:1 1111111 11111111 11111111 11111011 左移1位:1 1111111 11111111 11111111 11110110 取其补码:1 0000000 00000000 00000000 00001010 即:-10 5>>1 原码:0 0000000 00000000 00000000 00000101 右移1位:0 0000000 00000000 00000000 00000010 即:2 -5>>1 原码:1 00000000 00000000 00000000 00000101 补码:1 1111111 11111111 11111111 11111011 右移1位:1 1111111 11111111 11111111 11111101 取其补码:1 0000000 00000000 00000000 00000011 即:-3 5>>>1:与5>>1一样,都是高位补0 原码:0 0000000 00000000 00000000 00000101 右移1位:0 0000000 00000000 00000000 00000010 即:2 -5>>>1 原码:1 00000000 00000000 00000000 00000101 补码:1 1111111 11111111 11111111 11111011 右移1位:0 1111111 11111111 11111111 11111101 即:2147483645代码运行截图
总结:
位移操作很简单,使用补码移动,补齐空缺位就行,除了>>:补与最高位一致的;其他移动哪缺哪补零。
在java中无论截图中的a定义成 byte,short,int哪一种类型,它默认都是使用int类型(4字节32位),你使用long(8字节64位)
逐位取反|(按位或):
一真为真 1|0=1, 0|0=0, 1|1=1, 0|1=1&(按位与):
两真为真 1|0=0, 0|0=0, 1&1=1; 0&1=0^(按位异或):
相异为真 1^1=0 1^0=1 0^1=1 0^0=0.