雪花算法(02)算法中的位運算

前面介紹了雪花算法的理論基礎(chǔ),可以對大概的算法有個了解互订,但是細(xì)節(jié)上可能還是模糊叠赦,下面來說一下雪花算法中用到的位運算。這里先介紹兩個牲蜀,一個是:

<<

一個是

|

<<的作用是將數(shù)字向左移動笆制,這里的數(shù)字指的是二進(jìn)制中的數(shù),并不是字面上的長整型數(shù)字涣达,當(dāng)然移動后數(shù)字字面值肯定發(fā)生變化在辆,但是這里對這個操作的主要理解要放在二進(jìn)制數(shù)字向左移動上,而不是字面值擴(kuò)大2的n次方倍度苔。

?“|” 的作用是或運算匆篓,兩個數(shù)對應(yīng)的位上只要有一個是1就是1,這樣的官方解釋不太明顯寇窑,放在雪花算法中的作用就是合并數(shù)字鸦概,下面會詳細(xì)演示。也就是說甩骏,三個需要生成的部分窗市,分別由三個數(shù)來生成,然后利用 <<往左移動到對應(yīng)的位置饮笛,最后將三個數(shù)字用 | 合并咨察。這就是雪花算法中兩個位移操作的作用。




介紹一個例子比如有三個數(shù)字福青,分別打印出這三個數(shù)字的二進(jìn)制形式:

可以看到扎拣,5對應(yīng)的二進(jìn)制就是101,8對應(yīng)的2進(jìn)制就是1000,10對應(yīng)的二進(jìn)制就是1010。這三個數(shù)字轉(zhuǎn)換成二進(jìn)制后,所有的0和1自然還是在最右邊的末尾二蓝,下面就來進(jìn)行位移操作a向左移動20位誉券,b向左移動10位,c不變:

通過a和b位移結(jié)果的前后對比刊愚,可以發(fā)現(xiàn)在二進(jìn)制的形式下踊跟,位移操作的意義淺顯易懂,就是把代表值的所有數(shù)字向左移動了對應(yīng)的位數(shù)鸥诽。我們把雪花算法生成的數(shù)字也分成了三部分商玫,這三部分可以分別按照規(guī)則生成,然后用<<操作向左移動對應(yīng)的位數(shù)牡借,就可以到達(dá)對應(yīng)的位置拳昌,最后再合并即可。



來看一下合并的代碼:

上面的“a|b|c”操作就是合并三個數(shù)字钠龙,怎么合并呢炬藤?就是多個64位的數(shù)字對應(yīng)的合在一起,在這64中碴里,只要對應(yīng)位數(shù)上有一個位置是1沈矿,合并后這個位上的數(shù)字就是1,否則就是0咬腋,根據(jù)這個結(jié)果羹膳,我們看到數(shù)字d的二進(jìn)制形式確實包含了abc三個的所有數(shù)字。雖然最后的結(jié)果d是一個難以猜到的數(shù)字根竿,但是我們進(jìn)行位運算一定要看二進(jìn)制陵像,不要看整數(shù)字面值,這三個數(shù)字放在了各自對應(yīng)的位數(shù)范圍內(nèi)寇壳,只要三個數(shù)字的范圍不越界蠢壹,也就是說a永遠(yuǎn)在從右向左20位以后,b永遠(yuǎn)在10到20之間九巡,c永遠(yuǎn)在0到10之間,那么這三個數(shù)字就可以各管各的蹂季,并且結(jié)果是合法合理的冕广。


當(dāng)然這種操作也是有底線的,比如b偿洁,他的數(shù)字大小轉(zhuǎn)換成2進(jìn)制后如果長度比10位大撒汉,那么它就會和a互相影響,導(dǎo)致結(jié)果不可預(yù)料涕滋,這就是范圍的由來睬辐。我們再來考慮一下雪花算法,除了第一位0之外,第一部分是時間部分溯饵,占41位侵俗,也就是說生成的時間數(shù)字要向左移動(64-1-41=)22位,第二部分是機(jī)器信息丰刊,占10位隘谣,也即是說代表機(jī)器信息的數(shù)字生成后要向左移動(64-1-41-10=)12位,當(dāng)然第三部分在末尾啄巧,就不用位移了寻歧。這三部分計算出來并且向左位移完成后,直接用“|”運算合成即可秩仆,就是我們最終要的分布式唯一id码泛。





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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市澄耍,隨后出現(xiàn)的幾起案子噪珊,更是在濱河造成了極大的恐慌,老刑警劉巖逾苫,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卿城,死亡現(xiàn)場離奇詭異,居然都是意外死亡铅搓,警方通過查閱死者的電腦和手機(jī)瑟押,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來星掰,“玉大人多望,你說我怎么就攤上這事∏夂妫” “怎么了怀偷?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長播玖。 經(jīng)常有香客問我椎工,道長,這世上最難降的妖魔是什么蜀踏? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任维蒙,我火速辦了婚禮,結(jié)果婚禮上果覆,老公的妹妹穿的比我還像新娘颅痊。我一直安慰自己,他們只是感情好局待,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布斑响。 她就那樣靜靜地躺著菱属,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舰罚。 梳的紋絲不亂的頭發(fā)上纽门,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音沸停,去河邊找鬼膜毁。 笑死,一個胖子當(dāng)著我的面吹牛愤钾,可吹牛的內(nèi)容都是我干的瘟滨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼能颁,長吁一口氣:“原來是場噩夢啊……” “哼杂瘸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伙菊,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤败玉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后镜硕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體运翼,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年兴枯,在試婚紗的時候發(fā)現(xiàn)自己被綠了血淌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡财剖,死狀恐怖悠夯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躺坟,我是刑警寧澤沦补,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站咪橙,受9級特大地震影響夕膀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜美侦,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一产舞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧音榜,春花似錦、人聲如沸捧弃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嘴办,卻和暖如春瞬场,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涧郊。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工贯被, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妆艘。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓彤灶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親批旺。 傳聞我的和親對象是個殘疾皇子幌陕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

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