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 );
}
}
复制代码
小结
还是那句话,用的场景较少(面试这种场合可能多一些),平时没必要死记硬背,真要用的时候看看笔记能编码就可以了。