按位运算.md

Java 按位操作

1.正负数的二进制表示形式

    int 32位

        15的原码:00000000 00000000 00000000 00001111
            反码:00000000 00000000 00000000 00001111
            补码:00000000 00000000 00000000 00001111
        
        -15:原码:10000000 00000000 00000000 00001111
            反码:11111111 11111111 11111111 11110000
            补码:11111111 11111111 11111111 11110001

        -2:原码:10000000 00000000 00000000
            00000010
            反码:11111111 11111111 11111111
            11111101
            +1(逢二进一)
            补码:11111111 11111111 11111111
            11111110

计算机数字是以补码储存的
一个数为正,则它的原码、反码、补码相同
一个数为负,则符号位为1,其余各位是对原码取反,然后整个数加1
第一位为符号位 0正 1负

    1. ---
        15的原码:00000000 00000000 00000000 00001111
        -15的原码 10000000 00000000 00000000 00001111
        -15反码:11111111 11111111 11111111 11110000
           +1
       -15:11111111 11111111 11111111 11110001
    

        1原码:00000000 00000000 00000000 0000001
        
        -1 原码:10000000 00000000 00000000 0000001
        -1反码:11111111 11111111 11111111 11111110
            +1
        -1补码:11111111 11111111 11111111 11111111
       
    2. 位移操作
        >> 右移
            把整数m的二进制向右移n位,m为正数,高位补0,m为负数,高位补1
            3>>2:
            3:00000000 00000000 00000000 00000011
             移动2位置
           (高位)00000000 00000000 00000000 00000000(低位)
            3>>2=0
            
            -3>>2
            -3:11111111 11111111 11111111 11111101
               移动2位置
               11111111 11111111 11111111 1111111
            3>>2=0 
        << 左移
            向左移动,正数 ,地位补0,负数,低位补1
            3<<2
              移动2位置
              00000000 00000000 00000000 00001100
            3<<2=12
        >>> 无符号位移
           不管符号,高位都补0
            3>>>2=0
            -3>>>2
            -3 :11111111 11111111 11111111 11111101
            移动2
                00111111 11111111 11111111 11111111
            -3>>>2=1073741823
        > 注意:没有 <<<  
        > 位操作,速度快(底层就是二进制的机器操作指令)
        > a*2
        > 1 jvm 先为变量a分配空间
        > 2 再进行*操作
        > 3 才返回结果
        > a<<1 只需一条指令
        ----------------------------------
        ~ 按位非
            对整数的二进制 逐位取反
            4:00000000 00000000 00000000 00000100
             ~4   逐位取反
               11111111 11111111 11111111 11111011
               =-5
        | 按位或
            对两个整数的二进制 进行1|0=1,0|1=1,1|1=1,0|0=0;(有1就为1)
            4|-5
             4: 00000000 00000000 00000000 00000100
            -5  11111111 11111111 11111111 11111011    
             =  11111111 11111111 11111111 11111111=-1         
        & 按位与
            对两个整数的二进制 进行1|0=0,0|1=0,0|0=0,1|1=1;(有0就为0)
             4&-5
             4: 00000000 00000000 00000000 00000100
            -5  11111111 11111111 11111111 11111011    
             =  00000000 00000000 00000000 00000000=0
        ^ 按位异或
            对两个整数的二进制 进行1^1=0,1^0=1,0^=1,0^0=0;(同为0,异为1)  
             4^-5
             4: 00000000 00000000 00000000 00000100
            -5  11111111 11111111 11111111 11111011                                                        
             =  11111111 11111111 11111111 11111111=-1
        

猜你喜欢

转载自blog.csdn.net/YCJ_xiyang/article/details/82798003