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