Java的位运算、移位运算

上个月在做蓝牙通讯协议实现时数据操作基本处于Byte级别,所以用到了大量的位运算,恰巧看到这篇简单而又容易遗忘的基础点,所以翻译一下,顺便熟悉熟悉。


Java的位运算和移位运算非常强大,它可以在bit级别上使用int、long、short、byte以及boolean类型的数据,而且相比其他运算方式,位运算和移位运算的速度要快很多。但是很多Java程序员却对此了解不多,尤其时那些没有接触过C、C++语言的程序员。当然对于在学习Java之前已经了解了C、C++的程序员来说就没有那么陌生了,因为这些运算基本与C类似。

在许多面试题中也会经常出现这种运算题目。这个实例代码主要时为了快速的了解Java的位运算符之间的不同,以及如何使用他们,其次我们也会介绍一下无符号移位和有符号的移位运算。

基础

在介绍位运算和移位运算之前,你必须区分二进制、位、字节和位运算。良好的二进制运算基础对理解位运算将大有裨益。

1)二进制数据只会有两种0、1两种位,这也是为什么叫做二进制位的原因。

2)二进制的算术运算

0 + 0 = 0

1 + 0 =  1

1 + 1 =  10

3)取反运算:会将0改为1、1改为0,它用~来表示

4)OR运算:如果任一操作数中有1返回1;如果操作数均为0则返回0

5)AND运算:如果操作数均为1返回1,否则返回0

6)XOR运算:如果两个操作数相同则返回0;否则返回1,比如1XOR1返回0,1XOR0返回1,0XOR1返回1,0XOR0返回0

7)Java中的整数类型都是有符号的,其中最高位表示正负,高位为1表示负数,高位为0表示正数。

8)Java中的负数用2的补码来表示。2的补码=1的补码+1,1的补码全为0