# 位運算
- 數據在計算機中是以二進制的方式存放
- 位元運算:對整數的二進制進行操作
假設: a = 0110 1001B
、 b = 0101 110B
# 位運算子
二元運算子 | 功能 | 邏輯 |
---|
& | 按位 “與” | and |
| | 按位 “或” | or |
^ | 按位 “異或” | xor |
~ | 按位 “變反” | not |
# 複合位運算子
二元運算子 | 功能 | 範例 | 說明 |
---|
&= | 複合與 | x &= y | 令 x = x & y |
|= | 複合或 | x |= y | 令 x = x | y |
^= | 複合異或 | x ^= y | 令 x = x ^ y |
# 運算結果
- 按位 “與”
<整數A> & <整數B>
皆為 1 才為 1
- 按位 “或”
<整數A> | <整數B>
任一者為 1 就為 1
- 按位 “異或”
<整數A> ^ <整數B>
兩者不同才為 1
| 八位數 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|
初始值 | | | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
左移兩位 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 空位 補 0 |
结果值 | 溢出抹去 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
# 應用
- 運用按位 “與” 可以將某些位設置為 0
例如:我想將數字 a 的後半部變成 0,只要其跟 0 做運算即可
| a= 0110 | 1001B |
& | b= 1111 | 0000B |
| c= 0110 | 0000B |
- 運用按位 “或” 可以將某些位設置為 1
例如:我想將數字 b 的前半部都轉成 1,只要跟其跟 1 做運算即可
| a= 0110 | 1001B |
| | b= 1111 | 0000B |
| c= 1111 | 1001B |
- 運用按位 “異或” 可以將某些位相反,部分位保持不變
例如:我想要將數字 a 的前半部變反,後半部保持不變
| a= 0110 | 1001B |
^ | b= 1111 | 0000B |
| c= 1001 | 1001B |
# 位移運算子
位移運算子的目的是向左或向右移動目標運算元的每個位元
二元運算子 | 功能 | 邏輯 |
---|
<< | 保留正負號的左移 | a <<b (將 a 向左移 b 個單元) |
>> | 保留正負號的右移 | a >> b (將 a 向右移 b 個單元) |
>>> | 純粹的右移 | a >>> b |
# 複合位移運算
二元運算子 | 功能 | 範例 | 說明 |
---|
<<= | 複合左移 | x <<= y | 令 x = x << y |
>>= | 複合右移 | x >>= y | 令 x = x >> y |
>>>= | 複合右移 | x >>>= y | 令 x = x >>> y |
# 運算結果
| int a = 16; |
| int b = 2; |
| System.out.println( a << b ); |
| System.out.println( a >> b ); |
| System.out.println( a >>> b ); |
| int a = -16; |
| int b = 2; |
| System.out.println( a << b ); |
| System.out.println( a >> b ); |
| System.out.println( a >>> b ); |
# 應用
- 運用位移運算子可以高速的運算
*2
或 /2
運算!!
| int a = 3; |
| System.out.println(a * 2 * 2 * 2 * 2 * 2); |
| System.out.println(a << 5); |
| |
| int b = 20000; |
| System.out.println(b / 2 / 2 / 2 / 2 / 2); |
| System.out.println(b >> 5); |