NTU-CE
Computer Programming
Java
Programming Language
Hacks
在Java舉凡能夠視為整數值的型別(int、long、short、byte、char)變數都可以被轉成二進位制以Bitwise Operator操作,例如
等價
因為a <<= 1
比a *= 2
快,所以通常越是底層的Library就越常看見開發人員偏好二進位操作,我們不希望一個很基本的函式由於實作方式太耗時間就拖垮了那些使用它的程式。
Operand1 | Operand2 | Result |
---|---|---|
1 | 1 | 0 |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
Operand1 | Operand2 | Result |
---|---|---|
1 | 1 | 1 |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
Operand1 | Operand2 | Result |
---|---|---|
1 | 1 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
<< Left Shift Operator
「a<<b」代表a向左移b個位置,其右邊補b個0。
>>> Unsigned (Logical) Right Shift Operator
「a>>>b」代表a向右移b個位置,其左邊補b個0。
>> Signed (Arithmetic) Right Shift Operator
「a>>b」代表a向右移b個位置,其左邊補原本最左邊的位元值。
Java的int變數佔4個byte,也就是32個bit,每個bit上面不是0就是1。
例如
聰明如你,那負整數怎麼辦?
所謂的二補數系統,就是在能夠表達負整數的那麼多種系統中的其中一個系統而已。
它的特徵就是把最左邊的位元當作正負號,1代表負數,0代表正數。
例如
是負的。
是正的。
再來是知道正負號之後,它的絕對值怎麼算呢?
從二進位的角度,我們可以輕易地猜出int的最大正整數值及最小負整數值。
int最大正整數
int最小負整數
那0呢?
例如
往左移4個位置
但是!!!移過頭就不見了喔
如果把6左移100個位置,答案會是0喔(不會循環的意思)。
例如
往右移4個位置
但是!!!失去的不一定能找回來
如果把
向左移4個位置
再向右移4個位置
答案可是不會變回來的喔
例如
往右移4個位置,右邊再補滿原本的符號,即1(負號)
原本是負的右移之後還是負的喔
聰明如你,原本是正的右移之後也會是正的。