8位有符号二进制数(总结自《码出高效》)

2021年7月19日 8点热度 0条评论 来源: $Price$

1、原码,反码,补码

     概念

  • 原码:符号位和数字实际值的结合。正数数值部分是数值本身,符号位为0;负数数值部分是数值本身,符号位为1。

         8位二进制数的表示范围为[-127,127];

  • 反码:正数数值部分是数值本身,符号位为0;负数的数值部分是在正数表示的基础上对各个位取反,符号位位1。

         8位二进制数的表示范围为[-127,127];

  • 补码:正数数值部分是数值本身,符号位为0;负数的数值部分是在正数表示的基础上对各个位取反后加1,符号位为1。

         8位二进制数的表示范围为[-128,127];

      问题

   1、+0,-0的原码,反码,补码分别是什么?

       

+0,-0的原码,反码,补码

+0 -0
原码 0|0000000 1|0000000
反码 0|0000000 1|11111111
补码 0|0000000 0|0000000

正数的原码,反码,补码均为数值本身,由此+0的反码和补码都为其原码;

-0原码为1|0000000,其反码按规定为符号位不变,其余各位取反1|1111111,补码为反码+1,即10|0000000,发生溢出,舍弃溢出的1得到0|0000000。得到上述结果。

n位有符号二进制数数值范围公式

原码和反码-2^(n-1)-1~2^(n-1)-1

补码-2^(n-1)~2^(n-1)-1

2、位移运算

2.1、有符号位移运算

      十进制的奇数转化为二进制数之后,在向右移的过程中,最右边的1将被直接抹去,说明向右移对于奇数并非完全相当于除以2。在左移<<和右移>>两种运算中,符号位均参与移动,除负数往右移动,高位补1之外,其他情况均在空位处补0。

表格中二进制数均为原码的补码,因为计算机中的二进制运算都使用补码进行

8/0|0001000 35/0|0100011 -35/1|1011101
右移一位 4/0|0000100 17/0|0010001 -18/1|1101110
右移两位 2/0|0000010 8/0|0001000 -9/1|1110111
左移一位 16/0|0010000 70/0|1000110 -70/1|0111001
左移两位 32/0|0100000 -12/1|0001100 114/0|1110010

2.2、无符号位移运算

    无符号位移运算,符号表示为">>>"。该运算不存在向左移动的方式。当向右移动时,正负数高位均补零,正数向右移动的最小值为0,而负数不断向右移动的最小值为1。可自行论证。

    位移运算仅作用于整形(32位)和长整形(64位)数上,假如在整形数上移动的位数是字长的整数倍,无论是否带符号位及移动方向,均为本身。因为移动的位数是一个mod32的结果,即35>>1和35>>33是一样的结果。如果为长整形,mod64,即35<<1和35<<65的结果是一样的。负数在无符号往右移动63位时,除最右边为1,左边均为0,达到最小值1,如果>>64,则为其原数值本身。

public class test {
    public static void main(String[] args) {
        int i=35;
        System.out.println(i>>1);
        System.out.println(i>>33);
        long j=35l;
        System.out.println(j<<1);
        System.out.println(j<<65);

        long k=-35l;
        System.out.println(k>>63);
        System.out.println(k>>64);
    }
}

3、位运算

    位运算包括按位取反(~)、按位与(&)、按位或(|)、按位异或(^)等运算。如下

public class test {
    public static void main(String[] args) {
        //java中二进制以0b或0B开头
        //a和b为二进制数的00000001
        int a=0b0001;
        int b=0B01;
        System.out.println(a&b);
        System.out.println(a|b);
        //按位异或可以理解为相同为0,相异为1
        //即0^0=0,1^1=0,1^0=1
        System.out.println(a^b);

    }
}

 

    按位与和逻辑与(&&)运算都可以作用于条件表达式,但是后者有短路功能,表达如下:

boolean a=true;
boolean b=true;
boolean c=(a=(1=2))&&(b=(1==2));

     因为&&前边的条件表达式,即如上的红色代码部分结果为false,触发短路,直接退出,最后a的值为false,b的值为true。假如把&&修改为按位与&,则执行后a和b的值均为false。

     同样的,按位或对应的逻辑或运算(||)也具有短路功能,如下:

boolean e=false;
boolean f=false;
boolean g=(e=(1=1)||(f=(1=1));

     最后e的值为true,f的值为false。假如把||修改为按位或符号|,执行的结果为e和f都为true。

    原文作者:$Price$
    原文地址: https://blog.csdn.net/weixin_43188610/article/details/118881410
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。