06-原码、反码、补码 和 位运算符

发布时间 2023-07-09 17:09:23作者: 马铃薯1

原码:原码就是将一个数转换为二进制,第一位(即最高位)表示这个数的符号位,1位负号,0为正号

[+1]原 = [0000 0001]原

[-1]原 = [1000 0001]原

[+0]原 = [0000 0000]原  [-0]原 = [1000 0000]原

反码:正数的反码还是原码,负数的反码是原码除了符号位以外,其余位数按位取反

[+1] = [0000 0001]原 = [0000 0001]反

[-1] = [1000 0001]原 = [1111 1110]反

[+0]反 = [0000 0000]反  [-0]反 = [1111 1111]反

补码:正数的补码等于它的原码,负数的补码等于反码加一

[+1] = [0000 0001]原 =  [0000 0001]反 = [0000 0001]补

[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补

[+0]补 = [-0]补 = [0000 0000]补

这里需要注意:计算机在运算的时候,都是以补码的方式进行运算的

 

扩展:为什么要使用原码、反码和补码

原码可以被人脑直接识别并用于计算表示方式,但原码只能做到正数与正数之间的加法运算,而正数与负数相加,或负数与负数相加,就会引起莫名其妙的结果,这是因为符号位所引起的。

1 + 2 = [0000 0001]原 + [0000 0010]原 = [0000 0011]原 = 3 //正确

1 - 2 = 1 + (-2) = [0000 0001]原 + [1000 0010]原 = [1000 0011]原 = -3 //错误

为了解决原码做减法的问题, 反码可以使正数与负数相加

1 - 2 = 1 + (-2) = [0000 0001]原 + [1000 0010]原 = [0000 0001]反 + [1111 1101]反 = [1111 1110]反 = [1000 0001]原 = -1 //正确

-1 - 2 = (-1) + (-2) = [1000 0001]原 + [1000 0010]原 = [1111 1110]反 + [1111 1101]反 = [1111 1011]反 = [1000 0100]原 = -4 //错误

为了更好的解决原码做减法的问题,补码可以使负数与负数相加

-1 - 2 = (-1) + (-2) = [1000 0001]原 + [1000 0010]原 = [1111 1111]补 + [1111 1110]补 = [1111 1101]反 = [1000 0011]原 = -3 //正确

 

位运算符

在Java语言中,提供了7种位运算符,分别是按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、带符号右移(>>)和无符号右移(>>>)。

1. 按位与(&):两位都为1时,则结果才为1,否则为0

2. 按位或(|):两位有一个结果为1时,则结果为1,否则为0

3. 按位异或(^):两位一个为0,另一个为1时,则结果为1,否则为0

4. 取反(~):按位取反,也就是0变1,1变0

5. 左移(<<):二进制数据整体左移,各二进位全部左移若干位,高位丢弃,低位补0

6. 带符号右移(>>):二进制数据整体右移,各二进位全部右移若干位,对无符号数,高位补0

7. 无符号右移(>>>):二进制数据整体右移,符号位补0 (相当于除2)左边补0

public class TernaryOperatorDetail{
    public static void main(String[] args){

        // 2&3(计算机在运算的时候,都是以补码的方式进行运算的)
        // 2 = [0000 0000 0000 0010]原 = [0000 0000 0000 0010]补
        // 3 = [0000 0000 0000 0011]原 = [0000 0000 0000 0011]补
        // 按位与(&):两位都为1时,则结果才为1,否则为0
        // 2&3 = [0000 0000 0000 0010]补 = 0000 0000 0000 0010]原 = 2
        System.out.println(2&3);  //2

        // 2|3
        // 按位或(|):两位有一个结果为1时,则结果为1,否则为0
        // 2|3 = [0000 0000 0000 0011]补 = [0000 0000 0000 0011]原 = 3
        System.out.println(2|3);  //3

        // 2^3
        // 按位异或(^):两位一个为0,另一个为1时,则结果为1,否则为0
        // 2|3 = [0000 0000 0000 0001]补 = [0000 0000 0000 0001]原 = 1
        System.out.println(2^3);  //1
    }
}