哈嘍,本來打算講一講HashMap的原理的,但是發(fā)現(xiàn)在HashMap中用到了一些位運算符,所以打算先來講講Java的位運算符,這樣在講HashMap的時候更容易理解。
Java位運算符分為 &,|,^,~,>>,<<,位運算符是對2進制進行位運算,在2進制中1表示true,0表示false。
下面我們依次來講解下:
&(與運算符)
與運算符表示的是都為true的時候才是true,否則為false。
1 & 0 = 0
1 & 1 = 1
0 & 0 = 0
栗子:
3 & 6
我們先得到3和6的2進制,分別為
00000011
00000110
在與運算過后得到的是
00000010
所以最后結(jié)果轉(zhuǎn)換為10進制為2。
|(或運算符)
或運算符表示的是如果有一個為true,那么就為true,否則為false。
1 & 0 = 1
1 & 1 = 1
0 & 0 = 0
栗子:
5 | 7
我們先得到5和7的二進制,分別為
00000101
00000111
在或運算過后為
00000111
所以最后轉(zhuǎn)換為10進制為7。
^(異或運算符)
異或運算符表示的是如果相同,則為false,否則為true。
1 & 0 = 1
1 & 1 = 0
0 & 0 = 0
栗子:
4 ^ 9
我們先得到4和9的二進制,分別為
00000100
00001001
在異或運算過后為
00001101
轉(zhuǎn)換為10進制為13。
~(取反運算符)
取反表示為true為false,false為true。
~ 1 = 0
~ 0 = 1
在講栗子之前先說一下2進制的最高位是用來表示正負(fù)的,如果最高位為0,則為正數(shù),如果為1,則為負(fù)數(shù)。比如-6,轉(zhuǎn)換為2進制就是6的2進制取反然后+1。
6的2進制為(因為Int是32位,所以我們用32位表示更加清楚)
00000000 00000000 00000000 00000110
那么取反過后為
11111111 11111111 11111111 11111001
因為是-6,所以我們在6取反過后還要+1,那么-6的2進制為
11111111 11111111 11111111 11111010
在講完正負(fù)如何轉(zhuǎn)換2進制過后我們來舉一個取反的栗子
~6
我們先拿到6的2進制為
00000000 00000000 00000000 00000110
取反過后為
11111111 11111111 11111111 11111001
然后轉(zhuǎn)換為10進制,因為最高位為1,所以為負(fù)數(shù),負(fù)數(shù)轉(zhuǎn)換為10進制我們要先-1,再取反,最后得到的數(shù)前面加一個負(fù)號就好。
所以我們最后得到的是 -7。
>>(右移運算符)
右移就是將2進制向右移動。
栗子:
5 >> 2
就是將5的2進制向右移動2位。
5的2進制為
00000101
右移過后為
00000001
那么最后結(jié)果轉(zhuǎn)為10進制為1。
這里需要注意的是在移動過后必然需要補位,補位的時候如果左邊為0,那么久補0,如果為1,那么就補1。
<<(左移運算符)
左移運算符和右移運算符原理一樣,只不過是向左移動。這里我們還是用5來舉栗子。
5 << 2
5的2進制為
00000101
左移兩位過后為
00010100
轉(zhuǎn)換為10進制為20
上文中如果有錯誤歡迎大家指出。