成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

雪花算法(06)再說(shuō)幾個(gè)位運(yùn)算

lovXin / 2483人閱讀

摘要:位二進(jìn)制表示的最大值雪花算法已經(jīng)初步完成了?,F(xiàn)在我們?cè)賮?lái)看幾個(gè)位操作。前面我們說(shuō)過(guò)兩個(gè)位移操作,那兩個(gè)我們主要是關(guān)注二進(jìn)制形式的數(shù)字效果,這里我們就要看字面值的變化了。

n位二進(jìn)制表示的最大值

雪花算法已經(jīng)初步完成了。現(xiàn)在我們?cè)賮?lái)看幾個(gè)位操作。先看第一個(gè),還是左移操作,不過(guò)這里演示負(fù)數(shù)左移:

<<

看這個(gè)之前,我們先看一個(gè)關(guān)鍵的數(shù)字,最大的負(fù)整數(shù),-1L轉(zhuǎn)換為二進(jìn)制后的形式:

這里注意二進(jìn)制數(shù)字的思路是相反的,在負(fù)整數(shù)中,除去負(fù)號(hào)外,那個(gè)數(shù)字越大,這個(gè)負(fù)數(shù)就越小,在Java的二進(jìn)制形式中,首位代表正負(fù)號(hào),除去首位,剩下的數(shù)字值越大,真的就代表數(shù)字本身越大,無(wú)論正負(fù)。從上面打印可以看出,-1L的二進(jìn)制形式就是一個(gè)最大負(fù)整數(shù)。

我們前面討論位運(yùn)算提到過(guò)左移運(yùn)算 << ,那么負(fù)數(shù)左移會(huì)出現(xiàn)什么情況的呢?下面來(lái)看一個(gè)例子:

從字面值上來(lái)看,負(fù)整數(shù)左移和正整數(shù)左移效果是一樣的,就是把字面值變小了,二進(jìn)制的形式也能看出,所有的1左移后,右面直接補(bǔ)0,效果也是把數(shù)字變小了。

前面我們說(shuō)過(guò)兩個(gè)位移操作,那兩個(gè)我們主要是關(guān)注二進(jìn)制形式的數(shù)字效果,這里我們就要看字面值的變化了。-1L向左位移1位,字面值就變成

-1L * 2^1

如果向左位移n位,字面值就會(huì)變成:

-1L * 2^n

這就是-1L向左位移的字面值變化規(guī)律。

看完負(fù)數(shù)左移操作,再來(lái)看一個(gè)位移操作,取反操作:

~

取反的意思也是針對(duì)二進(jìn)制形式的數(shù)字說(shuō)的,因?yàn)樗形簧系臄?shù)字不是0就是1,所以取反的操作就是把0變成1,把1變成0,來(lái)看幾個(gè)例子:

上面的正整數(shù)3L,取反后,字面值變成了-4L,二進(jìn)制的數(shù)字中的0和1也徹底反了,0變成1,1變成0。而負(fù)整數(shù)-9L字面值變成了8L,二進(jìn)制數(shù)字的變化也是一樣的規(guī)律。大家可以多試幾次,從上面的內(nèi)容可以總結(jié)出取反的規(guī)律:

1、取反后,正整數(shù)變成了負(fù)整數(shù),負(fù)整數(shù)變成了正整數(shù)

2、取反后,無(wú)論原來(lái)是正數(shù)還是負(fù)數(shù),結(jié)果都會(huì)變成   (n+1) * -1L

取反操作我們也不看二進(jìn)制數(shù)字的變化,但看字面值的變化,可以總結(jié)出上面的規(guī)律。

現(xiàn)在有個(gè)需求,如果有三位二進(jìn)制數(shù),那么能表示的最大正數(shù)就是 111,也就是7,如果有四位就是1111,也就是15,如果有n位如何用位運(yùn)算表示?其實(shí)公式很容易推出來(lái),就是

2^n-1

這個(gè)公式和上面的負(fù)數(shù)左移很相似,我們來(lái)使用-1L進(jìn)行左移:

-1L << n

這樣n如果是3和4就分別對(duì)應(yīng)-8L和-16L,從字面值上看和我們的需求很接近,我們?cè)賮?lái)進(jìn)行取反操作:

~(-1L << n)

這樣3和4分別對(duì)應(yīng)的就是7和15了!上面這個(gè)位運(yùn)算公式,就是求出n位二進(jìn)制數(shù)能表示的最大整數(shù)的公式!

再來(lái)看雪花算法中的限制,數(shù)據(jù)中心id和機(jī)器id分別占5位,最大數(shù)都是31,毫秒內(nèi)序列占12位,最大值是4095,這個(gè)值直接定義上是最快的,現(xiàn)在也可以用高效的位運(yùn)算計(jì)算出來(lái)了:

不超過(guò)最大值的序列遞增

雪花算法的毫秒內(nèi)序列有兩個(gè)操作,一個(gè)是在同一毫秒內(nèi)加一,另一個(gè)是如果超過(guò)最大值,就強(qiáng)制等到下一個(gè)不同的時(shí)間從新開(kāi)始序列。這里也是可以用位操作實(shí)現(xiàn)的。這里首先討論下面的位操作:

&

這個(gè)操作的意思是同一個(gè)位上,都是1,結(jié)果才是1,否則就是0.下面用二進(jìn)制數(shù)字演示一下:

15L 轉(zhuǎn)換為2進(jìn)制形式后有個(gè)特點(diǎn),就是前面所有位上都是1,那么這個(gè)時(shí)候,其實(shí)較小的數(shù)是多少結(jié)果就是多少。從而可以推理出,只要較大的數(shù)有這個(gè)特點(diǎn),那么&操作的結(jié)果都和較小的數(shù)的值一樣。如果超過(guò)最大值會(huì)怎么樣呢?

可以看到,只要超過(guò)1,那么結(jié)果就會(huì)歸0,再加上1, 15L & 17L的話(huà),結(jié)果又會(huì)是1。這樣的&操作可以防止數(shù)字超過(guò)某個(gè)最大限制。這種特性正好用在毫秒內(nèi)序列的加一操作上。

seq = (seq + 1) & 4095;

像上面那種寫(xiě)法,其實(shí)最終值和

seq = seq + 1

效果是一樣的,不同的是,一旦超過(guò)了4095,seq會(huì)從新變成0。

代碼地址:https://gitee.com/blueses/sno... 06

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76172.html

相關(guān)文章

  • 雪花算法(07)雪花算法最終版

    摘要:雪花算法初步完成后,我們討論了幾個(gè)位運(yùn)算的寫(xiě)法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機(jī)器占多少位,或者時(shí)間向左位移多少,這些在算法具體邏輯確定后就不會(huì)變了。 雪花算法初步完成后,我們討論了幾個(gè)位運(yùn)算的寫(xiě)法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機(jī)器占多少位,或者時(shí)間向左位移多少,這些在算法具體邏輯確定后就不會(huì)變了。那么寫(xiě)成最后的數(shù)字和用位運(yùn)算計(jì)算出來(lái)有什么...

    piapia 評(píng)論0 收藏0
  • 雪花算法(03)生成時(shí)間

    摘要:前面的理論基礎(chǔ)和位運(yùn)算都了解了,下面我們來(lái)生成雪花算法的第一部分,也就是時(shí)間部分。這個(gè)時(shí)候就有一個(gè)問(wèn)題了,如果我們系統(tǒng)的時(shí)鐘錯(cuò)了會(huì)不會(huì)有問(wèn)題會(huì)所以要做判斷而且系統(tǒng)的時(shí)鐘錯(cuò)誤也是雪花算法的一個(gè)致命問(wèn)題,所以要一定要保證服務(wù)器的系統(tǒng)時(shí)間正確。 前面的理論基礎(chǔ)和位運(yùn)算都了解了,下面我們來(lái)生成雪花算法的第一部分,也就是時(shí)間部分。時(shí)間部分的邏輯起始很簡(jiǎn)單,就是規(guī)定一個(gè)起始時(shí)間戳,然后用當(dāng)前時(shí)間戳...

    張紅新 評(píng)論0 收藏0
  • 雪花算法(01)介紹

    摘要:雪花算法生成的最終結(jié)果其實(shí)就是一個(gè)類(lèi)型的長(zhǎng)整型數(shù)字,這是一個(gè)大前提算法所有的內(nèi)容都是針對(duì)這個(gè)數(shù)字進(jìn)行運(yùn)算的。根據(jù)上面的理論可以開(kāi)始學(xué)習(xí)雪花算法。 針對(duì)每個(gè)公司,隨著服務(wù)化演進(jìn),單個(gè)服務(wù)越來(lái)越多,數(shù)據(jù)庫(kù)分的越來(lái)越細(xì),有的時(shí)候一個(gè)業(yè)務(wù)需要分成好幾個(gè)庫(kù),這時(shí)候自增主鍵或者序列之類(lèi)的主鍵id生成方式已經(jīng)不再滿(mǎn)足需求,分布式系統(tǒng)中需要的是一個(gè)全局唯一的id生成規(guī)則。既然號(hào)稱(chēng)在全局分布式系統(tǒng)中唯一...

    or0fun 評(píng)論0 收藏0
  • 雪花算法(02)算法中的位運(yùn)算

    摘要:前面介紹了雪花算法的理論基礎(chǔ),可以對(duì)大概的算法有個(gè)了解,但是細(xì)節(jié)上可能還是模糊,下面來(lái)說(shuō)一下雪花算法中用到的位運(yùn)算。這就是雪花算法中兩個(gè)位移操作的作用。 前面介紹了雪花算法的理論基礎(chǔ),可以對(duì)大概的算法有個(gè)了解,但是細(xì)節(jié)上可能還是模糊,下面來(lái)說(shuō)一下雪花算法中用到的位運(yùn)算。這里先介紹兩個(gè),一個(gè)是:

    wangbjun 評(píng)論0 收藏0
  • 分布式id生成方案概述

    摘要:序本文主要來(lái)聊聊分布式的生成方案。分布式的生成,以為代表的,系列算法采用的就是劃分命名空間并行生成的思路。 序 本文主要來(lái)聊聊分布式id的生成方案。 目標(biāo) 業(yè)務(wù)系統(tǒng)需要什么樣的ID生成器中提出了幾點(diǎn)目標(biāo): 唯一性 時(shí)間相關(guān) 粗略有序 可反解 可制造 主要思路 對(duì)于每個(gè)標(biāo)識(shí),都需要有一個(gè)命名空間(namespace),來(lái)保證其相對(duì)唯一性。分布式的ID生成,以Twitter Snowf...

    Terry_Tai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<