操作符系列教材 (四)- Java的位操作符

操作符系列教材 (四)- Java的位操作符


位操作符在实际工作中用的并不常见,但是同学们总是很喜欢纠结这些位操作。

所以本章节会给出每一个操作符的操作实例帮助大家理解其具体含义。

最后说,如果确实感兴趣,就看看,个人建议跳过这个章节。 真正工作用到了,再来看。

步骤1:一个整数的二进制表达
步骤2:位或
步骤3:位与
步骤4:异或
步骤5:取非
步骤6:左移 右移
步骤7:练习-快速计算2x16
步骤8:答案-快速计算2x16
步骤9:带符号右移与无符号右移
步骤10:练习-位操作符
步骤11:答案-位操作符

示例 1 : 一个整数的二进制表达

位操作都是对二进制而言的,但是我们平常使用的都是十进制比如5。
而5的二进制是101。
所以在开始学习之前,需要掌握一个整数的二进制表达是多少。
通过Integer.toBinaryString() 方法,将一个十进制整数转换为一个二进制字符串

一个整数的二进制表达

public class HelloWorld {

    public static void main(String[] args) {

        int i = 5;

        String b = (Integer.toBinaryString(i)); // 5的二进制的表达101

        System.out.println(i+" 的二进制表达是: "+b);

    }

}

示例 2 : 位或

5的二进制是101
6的二进制是110
所以 5|6 对每一位进行或运算,得到 111->7

public class HelloWorld {

    public static void main(String[] args) {

         

        int i  =5;

        int j = 6;

         

        System.out.println(Integer.toBinaryString(i)); //5的二进制是101

         

        System.out.println(Integer.toBinaryString(j)); //6的二进制是110

         

        System.out.println(i|j); //所以 5|6 对每一位进行或运算,得到 111->7

 

    }

}

示例 3 : 位与

5的二进制是101
6的二进制是110
所以 5&6 对每一位进行与运算,得到 100->4

public class HelloWorld {

    public static void main(String[] args) {

         

        int i  =5;

        int j = 6;

         

        System.out.println(Integer.toBinaryString(i)); //5的二进制是101

         

        System.out.println(Integer.toBinaryString(j)); //6的二进制是110

         

        System.out.println(i&j); //所以 5&6 对每一位进行与运算,得到 100->4

 

    }

}

示例 4 : 异或

5的二进制是101
6的二进制是110
所以 5^6 对每一位进行异或运算,得到 011->3

一些特别情况:
任何数和自己进行异或 都等于 0
任何数和0 进行异或 都等于自己

public class HelloWorld {

    public static void main(String[] args) {

        int i  =5;

        int j = 6;

        System.out.println(Integer.toBinaryString(i)); //5的二进制是 101

        System.out.println(Integer.toBinaryString(j)); //6的二进制是110

        System.out.println(i^j); //所以 5^6 对每一位进行或运算,得到 011->3

         

        System.out.println(i^0);

        System.out.println(i^i);

    }

}

示例 5 : 取非

5 的二进制是 00000101
所以取反即为 11111010
这个二进制换算成十进制即为-6

public class HelloWorld {

    public static void main(String[] args) {

        byte i  =5;

         

        System.out.println(Integer.toBinaryString(i)); //5的二进制是00000101,所以取非即为11111010,即为-6

         

        System.out.println(~i);

         

    }

     

}

示例 6 : 左移 右移

左移:根据一个整数的二进制表达,将其每一位都向左移动,最右边一位补0
右移:根据一个整数的二进制表达,将其每一位都向右移动

public class HelloWorld {

    public static void main(String[] args) {

        byte i  =6;

         

        //6的二进制是110

        System.out.println(Integer.toBinaryString(i));

        //6向左移1位后,变成1100,对应的10进制是12

        System.out.println(i<<1);

        //6向右移1位后,变成11,对应的10进制是3

        System.out.println(i>>1);

    }

     

}

示例 9 : 带符号右移与无符号右移

带符号右移 >>
对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0
对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1
无符号右移>>>
如果是一个负数,那么对应的二进制的第一位是1
无符号右移>>>会把第一位的1也向右移动,导致移动后,第一位变成0
这样就会使得负数在无符号右移后,得到一个正数

简单的说:
带符号右移 >> 移动后正的还是正的,负的还是负的,符号不变
无符号右移>>>移动后,变正的了

public class HelloWorld {

    public static void main(String[] args) {

        int i  =-10;

         

        //-10的二进制是11111111111111111111111111110110

        //第一位是1,即符号位,代表这是一个负数

        System.out.println(Integer.toBinaryString(i));

         

        //对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0

        //对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1

         

        //-10带符号右移1位,移动后前面补齐1

        //得到11111111111111111111111111111011

        //因为第一位是1,所以依然是一个负数,对应的十进制是-5

        int j = i>>1;

        System.out.println(Integer.toBinaryString(j));

        System.out.println(j);

         

        //-10无符号向右移1位,符号位也会向右移,第一位就变成了0

        //得到01111111111111111111111111111011,对应的十进制是2147483643

        int k = i>>>1;

        System.out.println(Integer.toBinaryString(k));     

         

        System.out.println(k);

    }

     

}


更多内容,点击了解: https://how2j.cn/k/operator/operator-bitwise/270.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值