• 十、二进制、位运算、位移运算符


     

    一、二进制简介

    现代电子计算机全部采用的是二进制,因为它只使用01两个数字符号,简单方便。数字电路中,1代表高电平,2代表低电平。这样,数据的传输通过控制电平的高低就可以了。计算机内部处理信息,都是采用二进制数来表示的。二进制(Binary)数用01的两个数字及其组合来表示任何数,进位规则是“逢二进一”,按从右至左的顺序,右低位,左高位。

    二、二进制基础

    1.所有的二进制数最高位代表符号位,0表示正数,1表示负数。

    2.一个字节等于八位

    3.正数的原码、反码、补码都一样。

    4.一个数的原码就是根据数值和正负号直接写出来的码。

    5.取反就是指0110

    6.负数的反码=它的原码符号位不变,其他位取反;负数的原码=它的反码符号位不变,其他位取反。

    7.负数的补码=它的反码+1;负数的反码=它的补码-1

    8.0的反码,补码都是0

    9.Java没有无符号数,换言之,java中的数都是有符号的。

    10.在计算机运算的时候,都是以补码的方式来运算的。存储数据也是以补码的方式来存储的

    11.二进制与十进制的相互转换:

    比如一个二进制数原码是:

    0

    0

    0

    0

    0

    1

    0

    1

    先确定符号位,说明是正数。

    再看数值,数值等于1x2^0+0x2^1+1^2^2=5(2^0代表20次方)

    即每个第i位的数乘以2i-1次方,再把这些全部加起来,就是10进制的数。

    其实不仅二进制是这样算,所有进制的数(包括十进制)都是这么算的,比如78其实就是8x10^0+7x10^1

     

    十进制转为二进制就更简单了。

    比如22,先用二的次方表示出来,即22=16+4+2=1x2^4+0x2^3+1x2^2+1x2^1+0x2^0;

    显然,它的二进制表示就是

    0

    0

    0

    1

    0

    1

    1

    0

     

    三、位运算

    Java中有四个位运算,分别是“按位与&”、“按位或|”、“按位异或^”、“按位取反~”,这与逻辑运算符不同:

    按位与&:两个数全为1,结果才为1,否则为0.

    按位或|:两个数有一个为1,结果就为1,否则为0.

    按位异或^:两个数一个为1,一个为0,则结果为1,否则为0.

    按位取反~0变为11变为0.

     

    注意:运算的时候均要先根据原码得到补码再进行位运算。

    举例:

     

    ~2=

     

    2的原码00000010,同样反码也是00000010,进行“~”的位运算,即取反,取反之后变成11111101,反码取反之后得到的结果也是反码,说明反码是11111101,显然是负数,负数的补码原码反码可不相等,要根据规律来,所以我们先减一算得反码是11111100,再符号位不变其他位取反算得原码10000011,这显然是-3。所以~2= -3

    2&3=

    2=

    0

    0

    0

    0

    0

    0

    1

    0

    3=

    0

    0

    0

    0

    0

    0

    1

    1

    根据按位与的运算规则两个全为1结果才为1。那2&3的反码就是

    0

    0

    0

    0

    0

    0

    1

    0

    这显然是正数,那反码原码一样,即原码也是00000010,显然是2.

    所以2&3=2

    2|3=

    同理

    2=

    0

    0

    0

    0

    0

    0

    1

    0

    3=

    0

    0

    0

    0

    0

    0

    1

    1

    2|3=

    0

    0

    0

    0

    0

    0

    1

    1

    显然答案是3,即2|3=3

    ~-5=

    -5原码是10000101,反码是11111010,补码是11111011.

    算出补码,我们可以开始做按位取反运算了。

    取反之后是00000100,这是一个正数,所以原码跟补码相同。

    显然,答案就是4,即~-5=4.

    -3^3=?

    先得出两个数的补码,3的补码显然是00000011-3原码是10000011,反码是11111100,补码是11111101.

    3

    0

    0

    0

    0

    0

    0

    1

    1

    -3

    1

    1

    1

    1

    1

    1

    0

    1

    3^3

    1

    1

    1

    1

    1

    1

    1

    0

    11111110是补码,反码是11111101,原码是10000010.显然是-2

    -3^3=-2.

    1-2=

    在二进制中,1-2会被认为1+(-2)。先算出各自补码,1的补码00000001-2的原码10000010-2的反码11111101-2的补码11111110.

    1

    0

    0

    0

    0

    0

    0

    0

    1

    -2

    1

    1

    1

    1

    1

    1

    1

    0

    1+(-2)

    1

    1

    1

    1

    1

    1

    1

    1

    得到一个结果补码是11111111,那反码就是11111110,原码10000001,即-1,所以1-2=-1

    四、移位运算

    Java中有三个移位运算:

    算术右移”>>”:

    所有位的码右移,符号位不变,低位溢出,并用符号位补溢出的高位

    算术左移”<<”:

    所有位的码左移,符号位不变,低位补0.

    逻辑右移”>>>”:

    所有位的码右移(包括符号位),低位溢出,高位补0.

    注意:没有逻辑左移。使用”<<<”将会报错

    例子:

    5>>2=?

    5的补码为00000101

    5

    0

    0

    0

    0

    0

    1

    0

    1

    溢出位

    5>>1(右移一位)

    0

    0

    0

    0

    0

    0

    1

    0

    1

    5>>2(右移两位)

    0

    0

    0

    0

    0

    0

    0

    1

    0

    得到的补码为00000001,显然原码也是00000001,即5>>2=1.

    -1>>2=?

    -1的原码10000001,反码11111110,补码11111111

    -1

    1

    1

    1

    1

    1

    1

    1

    1

    溢出位

    1>>1(右移一位)

    1

    1

    1

    1

    1

    1

    1

    1

    1

    1>>2(右移两位)

    1

    1

    1

    1

    1

    1

    1

    1

    1

    补码还是11111111,显然结果的补码跟原来一样,结果的原码也跟原来一样,即-1>>2=-1.

    -5<<2=?

    -5原码10000101 反码11111010 补码11111011

    -5

    1

    1

    1

    1

    1

    0

    1

    1

    -5<<1(左移一位)

    1

    1

    1

    1

    0

    1

    1

    0

    -5<<2(左移两位)

    1

    1

    1

    0

    1

    1

    0

    0

    结果为补码为11101100,反码为11101011,原码为10010100,即-5<<2=-20

    127>>>2

    127的补码01111111

    127

    0

    1

    1

    1

    1

    1

    1

    1

    127>>>1(右移一位)

    0

    0

    1

    1

    1

    1

    1

    1

    127>>>2(右移两位)

    0

    0

    0

    1

    1

    1

    1

    1

    显然127>>>2=31.

    五、

    java中,如何最快判断一个数是不是2^n次方呢?如何让一个数最快的变成它的两倍呢?

    都是进行位运算,位运算是直接在内存中进行的,是最快的。

    1.

    public static boolean isPowerOfTow(int val){
    
        return (val&-val)==val;
    
    }
    

      

    2.

    public static void main(String[] args) {
    		int a=4;
    		System.out.println(a<<1);
    }
    

    在java中,算数右移一位代表除以2,算数右移两位代表除以4,以此类推

    在java中,算数左移一位代表乘以2,算数左移两位代表乘以4,以此类推

    所以java中,让一个数最快的变成它的两倍就是算数左移一位,即如上代码  

  • 相关阅读:
    oracle 11g行转列 列转行
    System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本
    ORA-00257: 归档程序错误。在释放之前仅限于内部连接
    java 回传参数
    Oracle 删除表分区
    Oracle 删除重复数据只留一条
    cmd下windows批处理,获取当前系统时间,生成日志文件名
    c# 应用程序部署发布
    eclipse 集成 STS 插件
    Mamen所需要的jar包怎么生成
  • 原文地址:https://www.cnblogs.com/myz666/p/7489332.html
Copyright © 2020-2023  润新知