计算机原码、补码和反码

在java中的整数值有四种表示方式:

十六进制:以0x或者0X开头,其中10~15分别用a~f来表示(不区分大小写);

十进制:最常见的一种进制,只有0~9

八进制:以0开头,只有1~7

二进制:以0b或者0B开头,只有0、1

但是在计算机中,所有数字都是以二进制形式保存,最高位为符号位,1表示负数,0表示正数,且以补码的形式保存所有的整数,而原码是直接将一个数值换算成十进制数。补码的计算规则为:正数的补码、反码和原码完全相同,负数的补码是其反码加1;反码是指对原码按位取反,(最高位)符号位不变。

1、讨论位操作符之按位非(~)(将操作数上的每个位,包括符号位,全部取反)

举个例子:~5的结果 为:-6

public class Main {

    public static void main(String[] args) {
        int a = 5 ;
        System.out.println(~a);  //输出结果为-6
    }
}

分析如下:

 5的原码:00000000  00000000  00000000   00000101

 5的补码:00000000  00000000  00000000   00000101       

取反之后:
                 11111111    11111111   11111111     11111010     这是最终结果的原码  最高位为1  是一个负数  之前说过计算机中的数值以补码形式存在,而负数的补码为其反码加1,所以先求反码:
                10000000  00000000  00000000   00000101    这是最终结果的反码  最高位为1  是一个负数 

负数的补码是其反码加1:
    10000000  00000000  00000000   00000110   这是最终结果的补码    转换为十进制  结果为-6

2、讨论位操作符之按位与(&)(当两位同时为1才返回1)

举个例子:

public class Main {

    public static void main(String[] args) {
        int a = 5;
        int b = 3;
        System.out.println(5&3);  //输出结果为 1
    }
}

分析如下:

5的二进制数:00000000  00000000  00000000  00000101

3的二进制数:00000000  00000000  00000000  00000011

我们知道,按位与(&)要求两个操作数的两位同时为1才返回1,所以5&3结果的二进制码为:

00000000  00000000  00000000  00000001

将二进制码转为十进制,输出结果为1。

3、讨论位操作符之按位或(|)(只要有一位为1,就返回1)

举个例子:

public class Main {

    public static void main(String[] args) {
        int a = 5;
        int b = 3;
        System.out.println(5|3);  //输出结果为 7
    }
}

分析如下:

5的二进制数:00000000  00000000  00000000  00000101

3的二进制数:00000000  00000000  00000000  00000011

我们知道,按位或(|)要求两个操作数只要有一位为1就返回1,所以5|3结果的二进制码为:

00000000  00000000  00000000  00000111

将二进制码转为十进制,输出结果为7。

4、讨论位操作符之按位异或(^)(当两位相同时返回0,不同时返回1)

举个例子:

public class Main {

    public static void main(String[] args) {
        int a = 5;
        int b = 3;
        System.out.println(5^3);  //输出结果为 6
    }
}

分析如下:

5的二进制数:00000000  00000000  00000000  00000101

3的二进制数:00000000  00000000  00000000  00000011

我们知道,按位异或(^)要求两个操作数两位相同时返回0,不同时返回1,所以5^3结果的二进制码为:

00000000  00000000  00000000  00000110

将二进制码转为十进制,输出结果为6。

5、讨论位操作符之左移运算符(<<)(把操作数的二进制码整体左移指定位数,右边空出来的为用0补充,若左移超出最大位数直接截断)

举个例子:将操作数5左移3位

public class Main {

    public static void main(String[] args) {
        int a = 5;
        int b = 3;
        System.out.println(a<<b);  //输出结果为 40
    }
}

5的二进制数:00000000  00000000  00000000  00000101

左移3位之后:00000000  00000000  00000000  00101000

将二进制码转为十进制,输出结果为40。

 6、讨论位操作符之右移运算符(>>)(把操作数的二进制码整体右移指定位数)

举个例子:

public class Main {

    public static void main(String[] args) {
        int a = 5;
        int b = 3;
        System.out.println(a>>b);  //输出结果为 0
    }
}

 5的二进制数:00000000  00000000  00000000  00000101

右移3位之后:00000000  00000000  00000000  00000000

将二进制码转为十进制,输出结果为0。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值