Java 原码、反码、补码,位运算符(&、|、~、^),移位运算(左移 <<、右移 >>、无符号右移 >>>)

1、原码

原码的组成:符号位(“0”代表正数、“1”代表负数)+数值的绝对值的二进制表示。
原码不能直接参与运算。
以八位二进制数为例:5的原码 = 0000 0101,-5的原码 = 1000 0101

2、反码

正数的反码等于它的原码,负数的反码就是原码符号位除外,其他位按位取反。
以八位二进制数为例:5的反码 = 0000 0101,-5的反码 = 1111 1010

3、补码

正数的补码等于它的原码,负数的补码就是它的反码+1。
在计算机系统中,数值一律用补码来表示和存储。
补码表示统一了符号位和数值位,简化了运算。
以八位二进制数为例:5的补码 = 0000 0101,-5的补码 = 1111 1011
补码的补码等于原码。

位运算符(ps:参与运算的都是补码)

按位与运算符(&)

参与运算的两数各对应的二进位相与,对应的两个二进位都为1,结果位才为1。

按位或运算符(|)

参与运算的两数各对应的二进位相或,对应的两个二进位有一个为1,结果位就为1。

按位异或运算符(^)

对应的两个二进位不同、结果位为1,相同、结果位为0。

按位取反运算符(~)

如果位为0,结果是1,如果位为1,结果为0。
对所有整数取反 = 本身的相反数-1。例:~9 = -10,~-4 = 3

移位运算(ps:参与运算的都是补码)

左移运算符(<<)

运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃,ps:符号位也会被舍弃),低位的空位补零。
在没有溢出的情况下,m << n 等于 m * 2^n

带符号右移运算符(>>)

运算规则:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
右移一位相当于除2,右移n位相当于除以2的n次方。这里是取商哈,余数就不要了

无符号右移运算符(>>>)

运算规则:按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同

在移位运算时,如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位

你可能感兴趣的:(Java 原码、反码、补码,位运算符(&、|、~、^),移位运算(左移 <<、右移 >>、无符号右移 >>>))