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

資訊專欄INFORMATION COLUMN

lodash源碼收獲之bitmarks

junfeng777 / 2318人閱讀

摘要:文章起因近期因?yàn)閷瘮?shù)式編程的產(chǎn)生了濃厚的興趣然后開始了的源碼閱讀結(jié)果開開頭就看到了這樣的代碼當(dāng)時(shí)看到這樣的數(shù)列一看就知道是的次方遞增跟二進(jìn)制逃不了干系然后我在函數(shù)里面發(fā)現(xiàn)這個(gè)函數(shù)主要是由一個(gè)的函數(shù)實(shí)現(xiàn)然后我又進(jìn)入了這個(gè)函數(shù)里面這里面有個(gè)按

文章起因

近期因?yàn)閷瘮?shù)式編程的curry產(chǎn)生了濃厚的興趣,然后開始了lodash的源碼閱讀,結(jié)果開開頭就看到了這樣的代碼

  var WRAP_BIND_FLAG = 1,
      WRAP_BIND_KEY_FLAG = 2,
      WRAP_CURRY_BOUND_FLAG = 4,
      WRAP_CURRY_FLAG = 8,
      WRAP_CURRY_RIGHT_FLAG = 16,
      WRAP_PARTIAL_FLAG = 32,
      WRAP_PARTIAL_RIGHT_FLAG = 64,
      WRAP_ARY_FLAG = 128,
      WRAP_REARG_FLAG = 256,
      WRAP_FLIP_FLAG = 512;

當(dāng)時(shí)看到2,4,8,16,這樣的數(shù)列一看就知道是2的次方遞增,跟二進(jìn)制逃不了干系.

然后我在curry函數(shù)里面發(fā)現(xiàn)這個(gè)函數(shù)主要是由一個(gè) createWrap的函數(shù) 實(shí)現(xiàn), 然后我又進(jìn)入了這個(gè)函數(shù)里面

    var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
    
    bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);

這里面有個(gè)按位與操作,我一看這上面的操作我都懂,但是我不知道,這些操作的結(jié)果能干嘛,也不知道為什么要這么做,于是就開始了我的求知之旅.

然后看到 lodash 作者在 那一段 標(biāo)記聲明語句的上面 寫了這么一個(gè)注釋

/* Used to compose bitmasks for function metadata. /

bitmasks? 先搜一下...

bitmasks是啥

寫過代碼的都知道,有些操作要判斷他是什么狀態(tài)才執(zhí)行,什么狀態(tài)不執(zhí)行.

那么我們就需要一些標(biāo)記來幫助我們來確定,他是什么狀態(tài)的.狀態(tài)可不止 true false 有時(shí)候可以很多.

bitmasks 就是用來標(biāo)記狀態(tài)的,只不過他是用位的方式來標(biāo)記.

比如: 0001,可以表示一種狀態(tài), 0011 也可以表示一種狀態(tài).

為什么要用 bitmasks

相信大家寫過這樣的代碼,比如程序員的擼碼和寫文章狀態(tài).

var NOW_Status = 0;
var CODING = 1;
var WRITING = 2; 

我們可以在上面的狀態(tài)中切換,我們設(shè)置狀態(tài)的時(shí)候可以這樣設(shè)置.

var NOW_STATUS = CODING;
if (NOW_STATUS === CODING) {
    // todo
}

如果我們的狀態(tài)需要組合,比如我現(xiàn)在一邊寫文章,一邊擼碼,那么我們是否要定義多一個(gè)狀態(tài)WRITING_CODING,來滿足我們的需求呢?

學(xué)過排列與組合的就知道,當(dāng)狀態(tài)越多的時(shí)候,組合是成次方增長的. 所以我們得要把這個(gè)變成運(yùn)算,不能手動的生成...

bitmarks 如何使用

如果使用bitmasks 狀態(tài)就會變成下面這樣.

var NOW_Status = 0;
var CODING = 2;
var WRITING = 4;

那么,現(xiàn)在我們設(shè)置狀態(tài)還用 a = b 這種形式嗎,既然使用了 bitmarks 那就要體現(xiàn)出這個(gè) bit.

現(xiàn)在我們這樣設(shè)置狀態(tài)

    var NOW_STATUS |= CODEING

二進(jìn)制就不再這里跟大家說了,程序員必備知識

這里用8位來演示,16 32 也不過是多幾個(gè)0而已

NOW_STATUS: 0 => 0000 0000
CODEING: 2 => 0000 0010
按位或操作 同位兩個(gè)數(shù)任意一個(gè)是1 結(jié)果就為1
得到 0000 0010 如此狀態(tài)設(shè)置成功

NOW_STATES === 2

| 按位或操作是放大操作, 也就得到的數(shù)可能會比兩個(gè)都大,如果前面的值是0,后面的值大于0, 那么得到的結(jié)果就是后者的本身,如此就完成了CODEING的狀態(tài)設(shè)定;

若是我們要消除這個(gè)狀態(tài),普通做法是重新賦值為NO_STATUS,現(xiàn)在我們這樣做.

    var NOW_STATUS &= ~(CODEING)

為什么要按位非,我們用按位或操作設(shè)置了值,如果我們要返回去,那么我們必須要按位與才能夠返回去,因?yàn)橐粋€(gè)為放大操作,一個(gè)為縮小操作,那么我們怎么才能返回去呢,按位與操作 相同位只要有一個(gè)0 那么結(jié)果位就是0 那么簡單了 我們只要把原來放大的數(shù)的相同位的1變回0 就可以了, 在按位操作中,~ 就是這樣的操作,就像這樣

2 => 0000 0010
按位非后 1111 1101
在與 0000 0010 按位與
變成0000 0000 了,

看這就回去了;

我如何知道我在那個(gè)狀態(tài)

如果兩個(gè)大于0的相同的數(shù) 按位與,結(jié)果會返回原來的數(shù)

就像這樣,

NOW_STATUS & CODEING > 0 那么就可以確定你再哪個(gè)狀態(tài)了

那么如果我的狀態(tài)要組合呢? 就是這兩個(gè)狀態(tài)隨便一個(gè)都符合要求的操作, 還需要重新定義一些狀態(tài)嗎, 不用, 我們有或操作, 這也是符合, 一真為真,同假才假的原則.像是這樣.

    var NOW_STATUS= CODEING | WRITING

nor! 狀態(tài)出來了, 而且極具可讀性, 一看就知道我或者在CODEING或者在WRITING.

解釋:
2 | 4 對比 返回的是6 任何兩個(gè)不一樣的數(shù)相或 ,都不會有重復(fù)的,因此 只要你定義狀態(tài)的時(shí)候 符合 1,2,4,8,16,32 這樣的規(guī)律你就不會擔(dān)心狀態(tài)值相等;

如何確定我在這多個(gè)狀態(tài)之中?

這樣

NOW_STATUS & (CODEING | WRITING) != 0 

首先NOW_STATUS 是由 CODEING | WRITING 來運(yùn)算出來的, 也就是說這里兩個(gè)數(shù)是相等的... 兩個(gè)相等的值做&操作, 返回的就是值本身, 又因?yàn)镹OW_STATUS 原本就是0 所以 如果他不是0, 那么就說明這個(gè)值是由這兩個(gè)狀態(tài)運(yùn)算得來, 也就可以確認(rèn)"我"在這個(gè)狀態(tài)組合里面了

bitmarks 的好處

其實(shí)在為什么要用bitmarks 的時(shí)候 出現(xiàn)的都是 bitmarks 的好處

但是還有一樣, 就是性能, 我們知道內(nèi)存中數(shù)字都是2進(jìn)制存的, 那么我們操作數(shù)字的時(shí)候使用2進(jìn)制的方式操作,能夠節(jié)省掉那么一絲的系統(tǒng)資源,螞蟻雖小也是肉!

最后

路漫漫其修遠(yuǎn)兮,吾將上下而求索.

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

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

相關(guān)文章

  • lodash源碼分析緩存使用方式的進(jìn)一步封裝

    摘要:但是在類中,要初始化緩存和設(shè)置緩存都需要提供和組成的二維數(shù)組,因此在類中,提供了一種更方便的緩存設(shè)置方式,只需要提供緩存的值即可。這里構(gòu)造函數(shù)不需要再傳入的二維數(shù)組了,只需要傳入包含所有緩存值的數(shù)組即可。 在世界上所有的民族之中,支配著他們的喜怒選擇的并不是天性,而是他們的觀點(diǎn)。——盧梭《社會與契約論》 本文為讀 lodash 源碼的第九篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎 star...

    neroneroffy 評論0 收藏0
  • lodash源碼分析緩存使用方式的進(jìn)一步封裝

    摘要:但是在類中,要初始化緩存和設(shè)置緩存都需要提供和組成的二維數(shù)組,因此在類中,提供了一種更方便的緩存設(shè)置方式,只需要提供緩存的值即可。這里構(gòu)造函數(shù)不需要再傳入的二維數(shù)組了,只需要傳入包含所有緩存值的數(shù)組即可。 在世界上所有的民族之中,支配著他們的喜怒選擇的并不是天性,而是他們的觀點(diǎn)?!R梭《社會與契約論》 本文為讀 lodash 源碼的第九篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎 star...

    wapeyang 評論0 收藏0
  • lodash源碼分析數(shù)組的差集

    摘要:依賴源碼分析之緩存使用方式的進(jìn)一步封裝源碼分析之源碼分析之源碼分析之的實(shí)現(xiàn)源碼分析之源碼分析的調(diào)用如果有傳遞,則先調(diào)用,使用生成要比較數(shù)組的映射數(shù)組。循環(huán)完畢,沒有在第二個(gè)數(shù)組中發(fā)現(xiàn)相同的項(xiàng)時(shí),將該項(xiàng)存入數(shù)組中。 外部世界那些破舊與貧困的樣子,可以使我內(nèi)心世界得到平衡?!柧S諾《煙云》 本文為讀 lodash 源碼的第十七篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎 star:pocke...

    Noodles 評論0 收藏0
  • lodash源碼分析自減的兩種形式

    摘要:作用與用法是的內(nèi)部函數(shù),之前在源碼分析之緩存介紹過一種這樣的數(shù)據(jù)結(jié)構(gòu)這是一個(gè)二維數(shù)組,每項(xiàng)中的第一項(xiàng)作為緩存對象的,第二項(xiàng)為緩存的值。 這個(gè)世界需要一個(gè)特定的惡人,可以供人們指名道姓,千夫所指:全都怪你?!迳洗簶洹懂?dāng)我談跑步時(shí)我談些什么》 本文為讀 lodash 源碼的第六篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎 star:pocket-lodash gitbook也會同步倉庫的更新...

    Keven 評論0 收藏0
  • lodash源碼分析isArguments

    摘要:卡爾維諾煙云本文為讀源碼的第二十一篇,后續(xù)文章會更新到這個(gè)倉庫中,歡迎也會同步倉庫的更新,地址依賴源碼分析之?dāng)?shù)據(jù)類型獲取的兼容性源碼分析之源碼分析用來判斷某個(gè)值是否為類對象。如果某個(gè)值為類對象使用判斷,并且調(diào)用返回的值為時(shí),則為類對象。 有人命中注定要過平庸的生活,默默無聞,因?yàn)樗麄兘?jīng)歷了痛苦或不幸;有人卻故意這樣做,那是因?yàn)樗麄兊玫降男腋3^了他們的承受能力。——卡爾維諾《煙云》 ...

    _Dreams 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<