1. 程式人生 > >java 位運算子 與或非

java 位運算子 與或非

int a = 3; 01 1
int b = 5; 10 1
/////////////////////////為了便於計算,a,b的最大值為 111,最小值為000,沒有涉及到符號運算(正負)
a&b  :"按位與",同時為1才為1,否則為0
a	0	1	1
b	1	0	1 	===>> a&b =7
	________________
	0	0	1 

a|b:"按位或",有一個為1則為1,否則為0
a	0	1	1
b	1	0	1 	===>> a|b =7
	________________
	1	1	1 
a^b:"按位異或",相同為1,否則為0
a	0	1	1
b	1	0	1 	===>> a^b = 1
	_________________
	0	0	1 
~a :"取反",1變0,0變1
a	0	1	1 	===>> ~a = 6
	________________
	1	1	0 
/////////////////////////////////////////////////////////////////////////////////////////


二進位制符號(正負)
二進位制正負的表示法,二進位制的最高位為0表示正,1表示負
以java中 byte為例 byte佔兩個位元組
0000 0000 最高位是符號位,所以能表示的最大數是 2^7 - 1 = 127
127 = 0111 1111
-127 = 1000 0001

負數的二進位制轉換
-7 首先求出 -7的絕對值(7)的二進位制
0000 1111
然後取反
1111 0000
然後加1
1111 0001
最終 -7 = 1111 0001

原理:
假如一位的十進位制,最大的是 9 ,最小的是0
取反的操作 實際上
a + ~a = 9
a + ~a + 1 = 10 由於只能表示9 所以 a+~a+1 = 0
而正數和負數的和 應該等於0

移位操作   >>  << 都是有符號移位,移位的時候帶上正負號
a = 3   011
a << 1  = 110 = 6  實際上就是擴大兩倍   (有符號移位需要注意)
a << n = a*2^n
a >> n = a/2^n       實際上就是除2

<<<   >>> 是無符號移位,純粹的乘2,除2