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

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

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

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));
         */
    
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳舞 D 猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值