位运算

作者: liut_2016 | 来源:发表于2016-09-23 10:43 被阅读44次

    1. 原码反码补码:

    计算机存储数据都是以二进制存储

    byte 8位
    short 16位
    int 32位
    long 64位

    其中 最高位为符号位,0代表正数,1为负数,并且负数以补码的形式存在和参与计算,如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。

    关于原码,反码,补码

    原码 即正确的值。
    反码 正数不变,负数反码 符号位不变,其余取反。
    补码 正数不变,负数为反码+1。

    负数(-2)原码反码例如:
    原码 1000 0010
    反码 1111 1101
    补码 1111 1110

    2. 位移运算

    • a << b 左移运算
      二进制形式的a左移b位,b小于总位数,左端舍去,右端补零,正负可能发生变化。
    • a >> b 右移运算
      二进制形式的a右移b位,b小于总位数,右端舍去,左边正数补0,负数补1。
    • a >>> b 无符号右移运算
      二进制形式的a左移b位,b小于总位数,右端舍去,左端补零

    3. 与,或,异或,非

    位运算.png

    & 同1则1
    | 同0则0
    ^ 相同为零,不同为1
    ~ 取反

    应用

    • & 取特定位
    • |某位 置1
    • ^特定位取反

    例如 :

    
        public static void main(String[] args) {
    
            int b = -7;
    
            /**
             * 取特定位
             * 假设要取b的低四位
             * 则需要低四位全为1,其余为0
             * 即 0000 0000 0000 0000 0000 0000 0000 1111
             * 即0xf
             */
    
            System.out.println(Integer.toBinaryString(b));          //1111 1111 1111 1111 1111 1111 1111 1001
            System.out.println(Integer.toBinaryString(b&0xf));      //1001
            /**
             * 取特定位  某位置0
             * 假设要取b的第五位
             * 则需要第五位为1,其余为0
             * 即 0000 0000 0000 0000 0000 0000 0001 0000
             * 即0x10
             * 右移 5-1 >>> 4
             */
            System.out.println(Integer.toBinaryString(b));          //1111 1111 1111 1111 1111 1111 1111 1001
            System.out.println(Integer.toBinaryString(b&0x10>>>4));     //1
    
            //--------------------------------------------------------------
    
    
    
            /**
             * | 某位 置1;
             * 假设要b的第3位 置1
             * 则需要一个 该位为1,其余为0的数
             * 即0000 0000 0000 0000 0000 0000 0000 0100
             * 即0x4
             */
            System.out.println(Integer.toBinaryString(b));          //1111 1111 1111 1111 1111 1111 1111 1001
            System.out.println(Integer.toBinaryString(b|0x4));      //1111 1111 1111 1111 1111 1111 1111 1101
    
            //----------------------------------------------------------------
    
            /**
             * ^ 使特定位取反
             * 假设需要b低4位取反
             * 则需要 一个低四位为1,其余为0的数
             * 即 0000 0000 0000 0000 0000 0000 0000 1111
             * 即 0xf
             */
            System.out.println(Integer.toBinaryString(b));              //1111 1111 1111 1111 1111 1111 1111 1001
            System.out.println(Integer.toBinaryString(b^0xf));          //1111 1111 1111 1111 1111 1111 1111 0110
            /**
             * 假设需要b第2位取反
             * 则需要 一个第3位为1,其余为0的数
             * 即 0000 0000 0000 0000 0000 0000 0000 0010
             * 即 0x2
             */
            System.out.println(Integer.toBinaryString(b));              //1111 1111 1111 1111 1111 1111 1111 1001
            System.out.println(Integer.toBinaryString(b^0x2));          //1111 1111 1111 1111 1111 1111 1111 1011
    
        }
    
    

    4.复合赋值运算符

    位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:

    &=例:a &= b相当于a=a & b
    |= 例:a |= b相当于a=a | b
    >>= 例:a >>= b 相当于a=a >> b
    <<= 例:a <<= b 相当于a=a << b
    ^= 例:a ^= b 相当于a=a ^ b

    相关文章

      网友评论

          本文标题:位运算

          本文链接:https://www.haomeiwen.com/subject/htdtyttx.html