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

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

雪花算法已經(jīng)初步完成了『ㄔ澹現(xiàn)在我們再來看幾個(gè)位操作曹洽。先看第一個(gè),還是左移操作辽剧,不過這里演示負(fù)數(shù)左移:

<<

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

這里注意二進(jìn)制數(shù)字的思路是相反的坊夫,在負(fù)整數(shù)中,除去負(fù)號外撤卢,那個(gè)數(shù)字越大环凿,這個(gè)負(fù)數(shù)就越小,在Java的二進(jìn)制形式中放吩,首位代表正負(fù)號智听,除去首位,剩下的數(shù)字值越大渡紫,真的就代表數(shù)字本身越大到推,無論正負(fù)。從上面打印可以看出惕澎,-1L的二進(jìn)制形式就是一個(gè)最大負(fù)整數(shù)莉测。

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

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

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

-1L * 2^1

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

-1L * 2^n

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







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

~

取反的意思也是針對二進(jìn)制形式的數(shù)字說的鸽捻,因?yàn)樗形簧系臄?shù)字不是0就是1,所以取反的操作就是把0變成1泽腮,把1變成0御蒲,來看幾個(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四濒、取反后,無論原來是正數(shù)還是負(fù)數(shù)职辨,結(jié)果都會變成? ?(n+1) * -1L

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





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

2^n-1

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

-1L << n

這樣n如果是3和4就分別對應(yīng)-8L和-16L察署,從字面值上看和我們的需求很接近闷游,我們再來進(jìn)行取反操作:

~(-1L << n)

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

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







不超過最大值的序列遞增

雪花算法的毫秒內(nèi)序列有兩個(gè)操作,一個(gè)是在同一毫秒內(nèi)加一岩调,另一個(gè)是如果超過最大值巷燥,就強(qiáng)制等到下一個(gè)不同的時(shí)間從新開始序列。這里也是可以用位操作實(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ù)的值一樣僵驰。如果超過最大值會怎么樣呢?

可以看到唁毒,只要超過1蒜茴,那么結(jié)果就會歸0,再加上1浆西, 15L & 17L的話粉私,結(jié)果又會是1。這樣的&操作可以防止數(shù)字超過某個(gè)最大限制近零。這種特性正好用在毫秒內(nèi)序列的加一操作上诺核。

seq = (seq + 1) & 4095抄肖;

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

seq = seq + 1

效果是一樣的窖杀,不同的是漓摩,一旦超過了4095,seq會從新變成0入客。


代碼地址:https://gitee.com/blueses/snowflake-demo? 06

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末管毙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桌硫,更是在濱河造成了極大的恐慌夭咬,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铆隘,死亡現(xiàn)場離奇詭異卓舵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)膀钠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門掏湾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肿嘲,你說我怎么就攤上這事忘巧。” “怎么了睦刃?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長十酣。 經(jīng)常有香客問我涩拙,道長,這世上最難降的妖魔是什么耸采? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任兴泥,我火速辦了婚禮,結(jié)果婚禮上虾宇,老公的妹妹穿的比我還像新娘搓彻。我一直安慰自己,他們只是感情好嘱朽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布旭贬。 她就那樣靜靜地躺著,像睡著了一般搪泳。 火紅的嫁衣襯著肌膚如雪稀轨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天岸军,我揣著相機(jī)與錄音奋刽,去河邊找鬼瓦侮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛佣谐,可吹牛的內(nèi)容都是我干的肚吏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼狭魂,長吁一口氣:“原來是場噩夢啊……” “哼罚攀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趁蕊,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤坞生,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掷伙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體是己,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年任柜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卒废。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宙地,死狀恐怖摔认,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宅粥,我是刑警寧澤参袱,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站秽梅,受9級特大地震影響抹蚀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜企垦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一环壤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钞诡,春花似錦郑现、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朵诫,卻和暖如春列牺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拗窃。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工瞎领, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泌辫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓九默,卻偏偏與公主長得像震放,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子驼修,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容