原码、反码、补码
- 二级制的最高位是符号位:0表示负数, 1表示正数
- 正数的原码、反码、补码都是一样的(三码合一)
- 负数的反码 = 它的原码符号位不变,其他位取反(0->1, 1->0)
- 负数的补码 = 它的反码 + 1, 负数的反码 = 负数的补码 - 1
- 0的反码补码都是0
- Java没有无符号数,换言之,Java中的数都是有符号的
- 在计算机运行时,都是以补码的方式来运算的
- 当我们看的运算结果的时候,要看他的原码
位运算
- Java中有7个位运算(&、|、^、~、>>、<<、>>>)
- 按位与(&):两个全为1则为1,否则为0
- 按位或(|):两位有一个为1,结果为1,否则为0
- 按位异或(^):两位一个为1,一个为0,结果为1,否则为0
- 按位取反(~):0 ->1、1 -> 0
例如:
按位与(&)2&3=2

按位取反()-2 = 1
- 先得到-2的原码 1010
- -2再取反 1101
- -2补码(反码+1) 1110
- ~-2运算 0001(补码)
- 补码取原码 符号位为0 则不变结果为1
按位取反()2 = -3
- 先得到2的原码 0010
- 2补码 0010
- ~2运算 1101(补码)
- 则不变结果为1,为负数,则补码 -1 再取反
- 1101 -> 1100(反码) -> 1011结果为 -3
位运算符
- 算数右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位
- 算数左移 <<:符号位不变,低位补0
-
逻辑右移也叫无符号右移,运算规则 低位溢出 高位补0
例如
1>>2 = 0
- 1的二进制为 0001
- 向右移动两位为 0000 等价于 1/2/2 =0 类似于十进制移动小数点)
1 << 2 = 4
- 1的二进制为 0001
- 向左移动两位为 0100 等价于 1 * 2 * 2 =4
评论区