摘要:位二進制表示的最大值雪花算法已經初步完成了。現在我們再來看幾個位操作。前面我們說過兩個位移操作,那兩個我們主要是關注二進制形式的數字效果,這里我們就要看字面值的變化了。
n位二進制表示的最大值
雪花算法已經初步完成了。現在我們再來看幾個位操作。先看第一個,還是左移操作,不過這里演示負數左移:
<<
看這個之前,我們先看一個關鍵的數字,最大的負整數,-1L轉換為二進制后的形式:
這里注意二進制數字的思路是相反的,在負整數中,除去負號外,那個數字越大,這個負數就越小,在Java的二進制形式中,首位代表正負號,除去首位,剩下的數字值越大,真的就代表數字本身越大,無論正負。從上面打印可以看出,-1L的二進制形式就是一個最大負整數。
我們前面討論位運算提到過左移運算 << ,那么負數左移會出現什么情況的呢?下面來看一個例子:
從字面值上來看,負整數左移和正整數左移效果是一樣的,就是把字面值變小了,二進制的形式也能看出,所有的1左移后,右面直接補0,效果也是把數字變小了。
前面我們說過兩個位移操作,那兩個我們主要是關注二進制形式的數字效果,這里我們就要看字面值的變化了。-1L向左位移1位,字面值就變成
-1L * 2^1
如果向左位移n位,字面值就會變成:
-1L * 2^n
這就是-1L向左位移的字面值變化規律。
看完負數左移操作,再來看一個位移操作,取反操作:
~
取反的意思也是針對二進制形式的數字說的,因為所有位上的數字不是0就是1,所以取反的操作就是把0變成1,把1變成0,來看幾個例子:
上面的正整數3L,取反后,字面值變成了-4L,二進制的數字中的0和1也徹底反了,0變成1,1變成0。而負整數-9L字面值變成了8L,二進制數字的變化也是一樣的規律。大家可以多試幾次,從上面的內容可以總結出取反的規律:
1、取反后,正整數變成了負整數,負整數變成了正整數 2、取反后,無論原來是正數還是負數,結果都會變成 (n+1) * -1L
取反操作我們也不看二進制數字的變化,但看字面值的變化,可以總結出上面的規律。
現在有個需求,如果有三位二進制數,那么能表示的最大正數就是 111,也就是7,如果有四位就是1111,也就是15,如果有n位如何用位運算表示?其實公式很容易推出來,就是
2^n-1
這個公式和上面的負數左移很相似,我們來使用-1L進行左移:
-1L << n
這樣n如果是3和4就分別對應-8L和-16L,從字面值上看和我們的需求很接近,我們再來進行取反操作:
~(-1L << n)
這樣3和4分別對應的就是7和15了!上面這個位運算公式,就是求出n位二進制數能表示的最大整數的公式!
再來看雪花算法中的限制,數據中心id和機器id分別占5位,最大數都是31,毫秒內序列占12位,最大值是4095,這個值直接定義上是最快的,現在也可以用高效的位運算計算出來了:
不超過最大值的序列遞增雪花算法的毫秒內序列有兩個操作,一個是在同一毫秒內加一,另一個是如果超過最大值,就強制等到下一個不同的時間從新開始序列。這里也是可以用位操作實現的。這里首先討論下面的位操作:
&
這個操作的意思是同一個位上,都是1,結果才是1,否則就是0.下面用二進制數字演示一下:
15L 轉換為2進制形式后有個特點,就是前面所有位上都是1,那么這個時候,其實較小的數是多少結果就是多少。從而可以推理出,只要較大的數有這個特點,那么&操作的結果都和較小的數的值一樣。如果超過最大值會怎么樣呢?
可以看到,只要超過1,那么結果就會歸0,再加上1, 15L & 17L的話,結果又會是1。這樣的&操作可以防止數字超過某個最大限制。這種特性正好用在毫秒內序列的加一操作上。
seq = (seq + 1) & 4095;
像上面那種寫法,其實最終值和
seq = seq + 1
效果是一樣的,不同的是,一旦超過了4095,seq會從新變成0。
代碼地址:https://gitee.com/blueses/sno... 06
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76172.html
摘要:雪花算法初步完成后,我們討論了幾個位運算的寫法,大家知道雪花算法一旦確定后,很多數字都是定死的,比如機器占多少位,或者時間向左位移多少,這些在算法具體邏輯確定后就不會變了。 雪花算法初步完成后,我們討論了幾個位運算的寫法,大家知道雪花算法一旦確定后,很多數字都是定死的,比如機器占多少位,或者時間向左位移多少,這些在算法具體邏輯確定后就不會變了。那么寫成最后的數字和用位運算計算出來有什么...
摘要:前面的理論基礎和位運算都了解了,下面我們來生成雪花算法的第一部分,也就是時間部分。這個時候就有一個問題了,如果我們系統的時鐘錯了會不會有問題會所以要做判斷而且系統的時鐘錯誤也是雪花算法的一個致命問題,所以要一定要保證服務器的系統時間正確。 前面的理論基礎和位運算都了解了,下面我們來生成雪花算法的第一部分,也就是時間部分。時間部分的邏輯起始很簡單,就是規定一個起始時間戳,然后用當前時間戳...
摘要:雪花算法生成的最終結果其實就是一個類型的長整型數字,這是一個大前提算法所有的內容都是針對這個數字進行運算的。根據上面的理論可以開始學習雪花算法。 針對每個公司,隨著服務化演進,單個服務越來越多,數據庫分的越來越細,有的時候一個業務需要分成好幾個庫,這時候自增主鍵或者序列之類的主鍵id生成方式已經不再滿足需求,分布式系統中需要的是一個全局唯一的id生成規則。既然號稱在全局分布式系統中唯一...
摘要:前面介紹了雪花算法的理論基礎,可以對大概的算法有個了解,但是細節上可能還是模糊,下面來說一下雪花算法中用到的位運算。這就是雪花算法中兩個位移操作的作用。 前面介紹了雪花算法的理論基礎,可以對大概的算法有個了解,但是細節上可能還是模糊,下面來說一下雪花算法中用到的位運算。這里先介紹兩個,一個是:
摘要:序本文主要來聊聊分布式的生成方案。分布式的生成,以為代表的,系列算法采用的就是劃分命名空間并行生成的思路。 序 本文主要來聊聊分布式id的生成方案。 目標 業務系統需要什么樣的ID生成器中提出了幾點目標: 唯一性 時間相關 粗略有序 可反解 可制造 主要思路 對于每個標識,都需要有一個命名空間(namespace),來保證其相對唯一性。分布式的ID生成,以Twitter Snowf...
閱讀 1582·2021-11-16 11:44
閱讀 7424·2021-09-22 15:00
閱讀 4462·2021-09-02 10:20
閱讀 1944·2021-08-27 16:20
閱讀 2386·2019-08-26 14:00
閱讀 2905·2019-08-26 11:44
閱讀 1627·2019-08-23 18:33
閱讀 1854·2019-08-22 17:28