看hashmap源碼的時候,其中一個indexfor方法讓我大開眼界,取下標的操作實在太騷了,然後又看到一個面試題
13 & 17 結果是什麼?
讓我對Java裏的運算符起了點興趣,特此記錄一下
要了解運算符首先得了解二進制,只記錄一下我的理解
首先看下1到10對應的二進制是多少吧
1 = 1
2 = 10
3 = 11
4 = 100
5 = 101
6 = 110
7 = 111
8 = 1000
9 = 1001
10= 1010
原先不知道怎麼快速算出二進制,查過資料以後,發現原來是很簡單的一個原理:除2取餘
比如 5,計算過程如下:
5/2 = 2……1
2/2 = 1……0
1/2 = 0……1
最後結果就是101
再隨便舉個例子
比如137,計算過程如下:
137/2 = 68……1
68/2 = 34……0
34/2 = 17……0
17/2 = 8……1
8/2 = 4……0
4/2 = 2……0
2/2 = 1……0
1/2 = 0……1
所以最後結果就是 1000 1001
挺有意思的幾個規律 :第一位肯定是1,最後一位就看奇數偶數了,奇數爲1,偶數爲0
還有很重要的一點 高位補0,二進制是有位數的,8位,16位,32位……
比如1,上面說過 他的二進制是1,那完整的二進制其實是 0000 0001,前7位算高位,是需要補上0的
再講一下二進制轉十進制
比如13,轉化過程如下:
13 : 1 1 0 1
2³ 2² 2¹ 2º
8 + 4 + 0 + 1 = 13
好了 這下二進制的就瞭解完了,還沒看懂的話,建議用紙跟筆親自算一下,很容易理解的
現在開始將位運算符
1.& 與運算
與運算的規則是 兩者都爲1時,才爲1,否則爲0
就拿開頭的13&17來舉例吧:
13的二進制爲 1101
17的二進制爲 10001
13 : 1 1 0 1
17 :1 0 0 0 1
& :0 0 0 0 1
所以結果就是1
2.| 或運算
或運算的規則是 兩者有1個爲1,那就是1,否則爲0
還拿13 17來舉例:
13 : 1 1 0 1
17 :1 0 0 0 1
| :1 1 1 0 1
結果爲 11101,轉換爲十進制 那就是1+4+8+16= 29
3.~ 非運算
非運算的規則是 如果位爲0,結果是1,如果位爲1,結果是0
比如13:
13 : 0 0 0 0 1 1 0 1
~ : 1 1 1 1 0 0 1 0
結果爲1111 0010 轉換爲十進制 那就是 0+2+0+0+32+64+128+256 = 482
4.^異或運算
異或運算的規則是:兩者相同則爲0,不同則結果爲1
照舊 13^17:
13 : 1 1 0 1
17 : 1 0 0 0 1
^ : 1 1 1 0 0
結果爲 11100,轉換爲十進制 那就是 0+0+4+8+16=28