Java中的位运算符

title: Java中的位运算符 date: 2017.06.03 12:30 categories:

  • 技术博客 tags:
  • 语言特性
  • Java

位运算符我平时很少用,上次可能就是在位状态码设计中用到了,那个地方的使用确实算蛮合适,然后我当时候下面放了个博客的链接用于简单介绍位运算的使用,有人提醒我跳过去看不够清晰(多半就是编辑器排版的问题),那行吧,我自己总结一下,放到这里。

这种东西最好还是看国外的文档,我给个关于位运算符(bitwise operator)的链接:Understanding Bitwise Operators供你详细了解,一共这么多种bitwise operator,我只谈谈前七个,够用了:

  • & (bitwise AND)
  • | (bitwise OR)
  • ~ (bitwise NOT)
  • ^ (bitwise XOR)
  • << (bitwise left shift)
  • >> (bitwise right shift)
  • >>> (bitwise unsigned right shift)
  • &= (bitwise AND assignment)
  • |= (bitwise OR assignment)
  • ^= (bitwise XOR assignment)
  • <<= (bitwise left shift and assignment)
  • >>= (bitwise right shift and assignment)
  • >>>= (bitwise unsigned right shift and assignment)

开始前先明白一点,即位运算都是基于二进制计算的,这也是性能上更优的本质原因,在这个链接Java - Bitwise Operators Example里面给出了例子,很直观,我直接拿他的代码过来解释:

1. 按位与

二元运算:二者对应位数为1结果为1,反之为0。

public class Test {

   public static void main(String args[]) {
      int a = 60;	/* 60 = 0011 1100 */
      int b = 13;	/* 13 = 0000 1101 */
      int c = 0;

      c = a & b;        /* 12 = 0000 1100 */
      System.out.println("a & b = " + c );
复制代码

2. 按位或

二元运算:二者对应位数只要存在一个1结果为1。

      c = a | b;        /* 61 = 0011 1101 */
      System.out.println("a | b = " + c );
复制代码

3. 按位抑或

二元运算:二者对应位数相同结果为0,不同为1。

      c = a ^ b;        /* 49 = 0011 0001 */
      System.out.println("a ^ b = " + c );
复制代码

4. 按位取反

一元运算:将参与运算的数各个位数0与1互相替换。

      c = ~a;           /*-61 = 1100 0011 */
      System.out.println("~a = " + c );
复制代码

需要注意的一点:如果操作数为负数,需要先拿到该数的原码,再得到原码的反码,最后拿到反码的补码进行取反操作。可参考:原码、反码、补码和移码其实很简单 。

5. 按位左移

移动数的二进制码,向左移动n位(看右边的参数),移动后的空位使用0填充。

      c = a << 2;       /* 240 = 1111 0000 */
      System.out.println("a << 2 = " + c );
复制代码

6. 按位右移

向右移动n位,左侧的空位使用「符号位」进行填充,即正数用0填充,负数用1填充

      c = a >> 2;       /* 15 = 1111 */
      System.out.println("a >> 2  = " + c );
复制代码

7. 无符号右移

向右移动n位,空位一律用0填充。

      c = a >>> 2;      /* 15 = 0000 1111 */
      System.out.println("a >>> 2 = " + c );
   }
}
复制代码

小结

还是那句话,用的场景较少(面试这种场合可能多一些),平时没必要死记硬背,真要用的时候看看笔记能编码就可以了。

转载于:https://juejin.im/post/5a311ce76fb9a0451c3a653b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值