文章背景:雪花算法 id 生成長度問題。java
Java位運算符
- 異或運算符(^)
<p>運算規則:兩個數轉爲二進制,而後從高位開始比較,若是相同則爲0,不相同則爲1。</p>
- 與運算符(&)
<p>運算規則:兩個數都轉爲二進制,而後從高位開始比較,若是兩個數都爲1則爲1,不然爲0。</p>
- 或運算符(|)
<p>運算規則:兩個數都轉爲二進制,而後從高位開始比較,兩個數只要有一個爲1則爲1,不然就爲0。</p>
- 非運算符(~)
<p>運算規則:若是位爲0,結果是1,若是位爲1,結果是0。</p>
Java位移運算符
- 左位移運算符(<<)
<p>運算規則:按二進制形式把全部的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。</p>
- 有符號右位移運算符(>>)
<p>運算規則:按二進制形式把全部的數字向右移動對應的位數,低位移出(捨棄);若符號位正,則在高位插入0;若符號位負。則在高位插入1。</p>
- 無符號右移運算符(>>>)
<p>運算規則:忽略符號位,空位都以0補齊</p>
原碼、反碼、補碼
- 原碼<br>
+1的原碼 0000 0001<br>
-1的原碼 1000 0001<br>
- 反碼<br>
正數的反碼是其自己<br>
負數的反碼是在其原碼的基礎上, 符號位不變,其他各個位取反。
- 補碼<br>
正數的補碼就是其自己<br>
負數的補碼是在其原碼的基礎上, 符號位不變, 其他各位取反, 最後+1。(即在反碼的基礎上+1)
Java int 轉 byte
- java採用補碼存儲整數。int型爲4字節32位,byte爲1字節8位。<br>
因此byte[]數組中存儲一個int類型確定是4個1字節的byte組成,即byte\[4\]才能夠存放一個int值
java中基本類型佔用字節數
| type | byte | bit |
| -------- | -----: | :----: |
| long | 8 | 64 |
| int | 4 | 16 |
SnowFlake生成的id的長度主要受創始時間戳影響。
41位時間截不是存儲當前時間的時間截,而是存儲時間截的差值(當前時間截 - 開始時間截) 獲得的值。這個差值愈來愈大,致使生成的id位數增長。