注意:
1.要做位運(yùn)算,首先得把數(shù)字轉(zhuǎn)化為二進(jìn)制并且是補(bǔ)碼。
2.&,|當(dāng)兩邊都是數(shù)字時(shí),為位運(yùn)算符;當(dāng)兩邊為布爾值時(shí),為邏輯運(yùn)算符。
位運(yùn)算符包括:&,|,^,~,<<,>>,>>>.
與位運(yùn)算符
//&運(yùn)算符,有0則0
//3? 00000000 00000000 00000000 00000011
//4? 00000000 00000000 00000000 00000100
//? 00000000 00000000 00000000 00000000
System.out.println(3&4);//結(jié)果為0
或位運(yùn)算符
//|運(yùn)算符,有1則1
//3? 00000000 00000000 00000000 00000011
//4? 00000000 00000000 00000000 00000100
//? 00000000 00000000 00000000 00000111
System.out.println(3|4);//結(jié)果為7
異或運(yùn)算符
//^運(yùn)算符,有相同則0,異同則1.
//3? 00000000 00000000 00000000 00000011
//4? 00000000 00000000 00000000 00000100
//? 00000000 00000000 00000000 00000111
System.out.println(3^4);//結(jié)果為7
//注意:一個(gè)數(shù)對(duì)另一個(gè)數(shù)異或兩次,該數(shù)本身不變。a^b^b = a。
按位取反運(yùn)算符
//|運(yùn)算符,有1則1
//3? ? 00000000 00000000 00000000 00000011
//? ? ? 11111111 11111111 11111111 11111100
//補(bǔ)碼? 11111111 11111111 11111111 11111100
//反碼? 11111111 11111111 11111111 11111011
//源碼? 10000000 00000000 00000000 00000100? -4
System.out.println(~3);//結(jié)果為7
左移<<
//<<左移 左邊最高位丟棄,右邊補(bǔ)齊0
//3? ? 00000000 00000000 00000000 00000011
//(00)000000 00000000 00000000 0000001100
//<<把<<左邊的數(shù)據(jù)*2的移動(dòng)次冪
System.out.println(2<<2);//結(jié)果為8
右移>>
//<<右移 左邊最高位是0補(bǔ)齊0,左邊最高位是1補(bǔ)齊1
//4? ? 00000000 00000000 00000000 0000100
// ? ? ? 00000000 00000000 00000000 000000100
//<<把<<左邊的數(shù)據(jù)*2的移動(dòng)次冪
System.out.println(4>>2);//結(jié)果為1
無(wú)符號(hào)移動(dòng)>>>,無(wú)論左邊是0還是1,左邊都補(bǔ)0
練習(xí):
請(qǐng)用最有效的方式計(jì)算出2*8?
2<<3 = 16
乘法的底層就是用為運(yùn)算進(jìn)行計(jì)算的。