常用的位运算符,&、|、~、^、<<、>>、>>>,java 版本

本贴最后更新于 697 天前,其中的信息可能已经时移世易

位运算符,&、|、~、^、<<、>>、>>>

位运算符主要针对二进制,它包括了:”与“、”或“、”非“、”异或“,与逻辑运算符符号相识,但逻辑运算符是针对两个关系来进行逻辑运算。

1.与运算符,符号:&,

==使用规律:两个操作数中,对应位都为 1,结果才为 1,否则结果为 0==

    public static void andOperator() {
        int a = 129, b = 128;
        String aBinaryCode = Integer.toString(a, 2);
        String bBinaryCode = Integer.toString(b, 2);
        System.out.println("a的二进制表示为:" + aBinaryCode);
        System.out.println("b的二进制表示为:" + bBinaryCode);
        System.out.println("a&b二进制表示为: " + Integer.toString((a & b), 2));
        System.out.println("a&b的结果是: " + (a & b));
    }

2.或运算符,符号:|

==使用规律:两个操作数中,对应位只要有一个为 1,结果才为 1,否则结果为 0==

    public static void orOperator() {
        int a = 129, b = 128;
        String aBinaryCode = Integer.toString(a, 2);
        String bBinaryCode = Integer.toString(b, 2);
        System.out.println("a的二进制表示为:" + aBinaryCode);
        System.out.println("b的二进制表示为:" + bBinaryCode);
        System.out.println("a|b二进制表示为: " + Integer.toString((a | b), 2));
        System.out.println("a|b的结果是: " + (a | b));
    }

3.非运算符,符号:~

==使用规律:如果位为 0,结果为 1、如果位为 1,结果为 0,按位取反==

    public static void notOperator() {
        int a = -37;
        String aBinaryCode = Integer.toString(a, 2);
        System.out.println("a的二进制表示为:" + aBinaryCode);
        System.out.println("~a二进制表示为: " + Integer.toString(~a, 2));
        System.out.println("~a的结果是: " + ~a);
  
        /**
         * int 长度为8个字节,一个字节8位,占32位
         * 以37为例:转为二进制:100101,
         * 补码为:00000000 00000000 00000000 00100101
         * 取反为:11111111 11111111 11111111 11011010
         * 因为最高为是1,所以原码为负数,负数的补码是其绝对值的原码取反,末尾再加1
         * 所以将补码还原 ,高位不变,是减1,再取反  减一后为:11111111 11111111 11111111 11011001
         *                              取反后为:10000000 00000000 00000000 00100110
         *                              为-38
         * 个人总结(不一定对,仅供参考):~运算符,为将原来的值+1,再加-号(负号)
         * eg:~36=-37、~(-36)=35
         */
    }

4.异或运算符,符号:^

==使用规律:两个操作数中,对应位相同,结果才为 0,否则结果为 1==

    public static void xorOperator() {
        int a = 129, b = 128;
        String aBinaryCode = Integer.toString(a, 2);
        String bBinaryCode = Integer.toString(b, 2);
        System.out.println("a的二进制表示为:" + aBinaryCode);
        System.out.println("b的二进制表示为:" + bBinaryCode);
        System.out.println("a^b二进制表示为: " + Integer.toString((a ^ b), 2));
        System.out.println("a^b的结果是: " + (a ^ b));
    }

5.左移运算符,符号:<<

==使用规律:左操作数,按为左移右操作数指定位数(后面直接补 0)==

eg:2 << 3=2*Math.pow(2,3)

    public static void moveLeft() {
        int a = 2;
        String aBinaryCode = Integer.toString(a, 2);
        System.out.println("a的二进制表示为:" + aBinaryCode);
        System.out.println("a<<3二进制表示为: " + Integer.toString(a << 3, 2));
        System.out.println("a<<3的结果是: " + (a << 3));
    }

6.右移运算符,符号:>>

==使用规律:左操作数,按为右移右操作数指定位数 eg:8 >> 3=8/Math.pow(2,3)==

如果该数为正,则高位补 0,而若该数为负数,则右移后高位补 1,以上特性不变

    public static void moveRight() {
        int a = 8;
        String aBinaryCode = Integer.toString(a, 2);
        System.out.println("a的二进制表示为:" + aBinaryCode);
        System.out.println("a>>3二进制表示为: " + Integer.toString(a >> 3, 2));
        System.out.println("a>>3的结果是: " + (a >> 3));
  
    }

7.无符号右移运算符,符号:>>>

==也叫逻辑右移,即该数为正,则高位补 0,而若该数为负数,则右移后高位同样补 0==

    public static void moveLogicRight() {
  
        //a为正数时,>> 和 >>>没有区别,正数的原码,补码,反码基本不变
        int a = 8;
        String aBinaryCode = Integer.toString(a, 2);
        System.out.println("a的二进制表示为:" + aBinaryCode);
        System.out.println("a>>>3二进制表示为: " + Integer.toString(a >>> 3, 2));
        System.out.println("a>>>3的结果是: " + (a >>> 3));
  
        //当a为负数时
        int b = -8;
        String bBinaryCode = Integer.toString(b, 2);
        System.out.println("b的二进制表示为:" + bBinaryCode);
        System.out.println("b>>>3二进制表示为: " + Integer.toString(b >>> 3, 2));
        System.out.println("b>>>3的结果是: " + (b >>> 3));
  
        /**
         * 负数的二进制为其正数的补码+1,第一位改为1 本例: b=-8
         * 原码:最高位为1 ,其余位为其正数的二进制 : 10000000 00000000 00000000 00001000
         * 反码:按位取反,11111111 11111111 11111111 11110111
         * 补码:最高位不变,其它位按位取反 然后+1 (针对原码而言),
         * 实际就是反码+1 ,注意逢2进1 :11111111 11111111 11111111 11111000
         * 右移三位:高位补0::     00011111 11111111 11111111 11111111
         * 位运算都是对补码左右移
         * System.out.println(Integer.parseInt("00011111111111111111111111111111",2));
         */
  
    }

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...