liut

liut.xyz

位运算

Posted at — Sep 23, 2017

1. 原码反码补码:

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

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

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

关于原码,反码,补码

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

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

2. 位移运算

3. 与,或,异或,非

位运算.png

& 同1则1 | 同0则0 ^ 相同为零,不同为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

comments powered by Disqus