在计算机中所有数据都是以二进制的形式储存的。Java 中的位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效。基本的位运算符有与、或、异或、取反、左移、右移和无符号右移。
与
- 符号是:&, 含义:按位与,双目运算符
- 相同位都为 1 时,结果才为 1。否则该位为 0
- 3->11, 4->100。可得结果,从右边起,第一位是0,第二位是0,第三位是0。故可得,3 & 4 = 0
- 3->11, 7->111。可得结果,从右边起,第一位是1,第二位是1,第三位是0。故可得,3 & 7 = 3
或
- 符号是:
|
,含义:按位或,双目运算符 - 相同位都为 0 时,结果才为 0。否则该位为 1
- 3->11, 4->100。可得结果,从右边起,第一位是1,第二位是1,第三位是1。故可得,3 & 4 = 7
- 3->11, 7->111。可得结果,从右边起,第一位是1,第二位是1,第三位是0。故可得,3 & 7 = 7
异或
- 符号是:^,含义:按位异或,双目运算符
- 相同位相同时,结果为 0。相异是为 1
- 3->11, 4->100。可得结果,从右边起,第一位是1,第二位是1,第三位是1。故可得,3 & 4 = 7
- 3->11, 7->111。可得结果,从右边起,第一位是0,第二位是0,第三位是1。故可得,3 & 7 = 4
取反
- 符号是:~,单目运算符
- 0 变 1,1 变 0
- 3->11, 可得 ~3 = -4
- 6->110,可得 ~6 = -7
左移
- 符号是:
<<
,含义:按位左移,双目运算符。 - int 类型左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
- 最左侧第一位是符号位, 0 代表正数,1 代表负数。
- 定义十进制整数:int value = 733183670,转换为二进制如下图:
value <<
1, 如下图:
左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍。
value <<
8,如下图:
右移
- 符号是:
>>
,含义:按位右移,双目运算符。 - int 类型右移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
- 定义十进制整数:int value = 733183670,转换为二进制如下图:
value >>
1, 如下图
value >>
8, 如下图
无符号右移
- 符号是:
>>>
, 含义:按位右移,保留原来的符号位,双目运算符。 - int 类型右移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
- 对于正数移位来说等同于:
>>
,负数通过此移位运算符能移位成正数。 - 定义十进制整数:int value = -733183670
value >>
8, 如下图: