位运算及在java中的应用整理
計算機編碼:
- 原碼
符號位為0表示正數,為1表示負數;
其余各位等同于真值的絕對值。
如:0000 0000 0000 0010 =2,1000 0000 0000 0010 =-2
?
- 反碼
符號位的用法及正數的表示與“原碼”一樣;
負數的表示是在“原碼”表示的基礎上通過將符號位以外的各位取反來獲得的。
如:0000 0000 0000 0010 = 2,1111 1111 1111 1101 = -2
?
- 補碼
符號位的用法及正數的表示與“原碼”一樣;
負數的表示是在“反碼”的基礎上通過加1來獲得的。
如:0000 0010 = 2,1111 1110 = -2
計算機中負數的表示均用補碼,負數參與的運算得到的也是補碼
?
位運算符:
& 與。??? 全1為1, 有0為0。 任何數與0與都等于0。
| 或。????? 有1為1, 全0為0。 任何數與0或都等于原值。
~ 非。???? 逐位取反
^ 異或。? 相同為0,相異為1。????? 任何數與0異或都等于原值。
?
?
Java基本類型的字節長度
java基本類型的的字節長度與具體的軟硬件環境無關。Java中的char類型用Unicode碼儲存。
各個類型長度為:
byte : 1
short : 2
char : 2
int : 4
long : 8
float : 4
double: 8
boolean : 1
?
?
java各個類型的二進制編碼實例(System.out.println(Integer.toBinaryString(i));)
int i = 1;
二進制表示為:(原碼)
00000000 00000000 00000000 00000001
int i = -1;
二進制表示為:(補碼)
11111111 11111111 11111111 11111111
?
long l = 1;
二進制表示為:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
?
特別注意:
負數都是用補碼表示并參與運算的。得到的也是補碼,需要減1取反獲得原碼。
?
位運算事例
-1^1,
-1
1000 0000 0000 0000 0000 0000 0000 0001--原碼
1111 1111 1111 1111 1111 1111 1111 1110--反碼
1111 1111 1111 1111 1111 1111 1111 1111--補碼
1
0000 0000 0000 0000 0000 0000 0000 0001--原碼
?
則-1^1等于
1111 1111 1111 1111 1111 1111 1111 1111^
0000 0000 0000 0000 0000 0000 0000 0001=
1111 1111 1111 1111 1111 1111 1111 1110--補碼
1111 1111 1111 1111 1111 1111 1111 1101--反碼
1000 0000 0000 0000 0000 0000 0000 0010--原碼
即-1^1=-2
?
移位運算:
- 邏輯左移 <<
右邊補0,符號位就是被移動到的位.
?
正數:
x<<1一般相當于2x,但是可能溢出.
若x在這個范圍中: 2的30次方~(2的31次方-1) 二進制表示 0100...0000到0111...1111,<<后最高為變為1了,變成負數了.
負數:
x<<1一般也相當于2x,也有可能溢出.
若x在這個范圍中: -2的31次方~-(2的30次方+1)二進制表示1000...0000到1011...1111,<<后最高為變成0了,變成正數了.
?
- 算術右移 >>
為正數時左邊補0,為負數時左邊補1.
x>>1,相當于x/2,余數被舍棄,因為這個是縮小,所以不會溢出.
不過有一點要注意: -1右移多少位都是-1.(因為負數都是用補碼表示,-1永遠是 11111...)
另外舍棄的余數是正的:
?3>>1=1? 舍棄的余數是1.
-3>>1=-2 舍棄的余數也是1,而不是-1.
對于正數 x>>1和x/2相等
對于負數 x>>1和x/2不一定相等.
?
- 邏輯右移 >>>
這個把符號位一起移動,左邊補0
對于正數,>>>和>>是一樣的
對于負數,右移之后就變成正數
?
?
對char,byte或者short進行移位處理,那么在移位進行之前,它們會自動轉換成一個int。
但在進行邏輯右移位時,也可能遇到一個問題。若對byte或short值進行右移位運算,
得到的可能不是正確的結果(Java 1.0和Java 1.1特別突出)。它們會自動轉換成int類型,并進行右移位。
但“零擴展”不會發生,所以在那些情況下會得到-1的結果。
?
?
? ? ? ? ? ? ? ? ??
int i = -1;i >>>= 10;System.out.println(i);System.out.println(Integer.toBinaryString(i));long l = -1;l >>>= 10;System.out.println(l);System.out.println(Long.toBinaryString(l));short s = -1;s >>>= 10;System.out.println(s);System.out.println(Integer.toBinaryString(s));byte b = -1;b >>>= 10;System.out.println(b);System.out.println(Integer.toBinaryString(b));?
?
?輸出結果
41943030000 0000 0011 1111 1111 1111 1111 1111180143985094819830000 0000 0011 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111-11111 1111 1111 1111 1111 1111 1111 1111-11111 1111 1111 1111 1111 1111 1111 1111?
? ?一道詭異的移位題
? int i=-1;
? int j=i>>>32;
? System.out.println(j);
輸出結果為 -1
JAVA進行移位運算中因為int是占32位,進行移位的數是32的模,所以當i>>>32的時候就等于i>>>0,相當于沒有進行移位.
轉載于:https://www.cnblogs.com/wully/p/3431482.html
總結
以上是生活随笔為你收集整理的位运算及在java中的应用整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 下判断Server 内存是否
- 下一篇: 设置Exchange 2010附件大小限