二進制妙用之循環計數

1. 什麼是循環計數

從0到n之間循環依次取數,假設 n=3,那麼我需要的如下數據 0,1,2,3,0,1,2...;現象就這樣,我也不知道循環計數這個名詞是否合適.姑且,就認爲合適吧.

2. 常規實現

這點需求,相信對於所有的coder都小菜一碟.我們愉快的寫下如下代碼

// author: herbert 464884492
// 公衆號: 小院不小
 for(let i=0;i<=3;i++){
     console.log(i);
     if(i==3){
         i=-1;// 一次for循環後,先執行++,在判斷條件
     }
     // do something 
     // jump for 
 }

3. 二進制實現

相信很多朋友,對於這麼簡單的需求.應該可以一口氣實現好多個.姑且就一打吧.當然,我們今天的重點並不是討論總共有多啊少種實現方式,這裏的重點是二進制.好吧,那用二進制改怎麼實現呢?

// author: herbert 464884492
// 公衆號: 小院不小
let i=0;
while(true){
  console.log(i++&0x3); // ++運算符優先級 17 邏輯與 16
  // do something
  // jump while
}

以上代碼中,++先執行,再執行邏輯與.不清楚優先級的朋友,括號最好還是加上.運算符優先級鏈接,我這裏將其複製過來,所有優先級順序如下

優先級 運算類型 關聯性 運算符
20 圓括號 n/a(不相關) (...)
19 成員訪問 從左到右 ... . ...
19 需要計算的成員訪問 從左到右 ... [ ... ]
19 new(帶參數列表) n/a new ...( ... )
19 函數調用 從左到右 ... ( ... )
19 可選鏈(Optional chanining) 從左到右 ?.
18 new(無參數列表) 從右到左 new ...
17 後置遞增 n/a ...++
17 後置遞減 n/a ...--
16 邏輯非 從右到左 ! ...
16 按位非 從右到左 ~ ...
16 一元加法 從右到左 + ...
16 一元減法 從右到左 - ...
16 前置遞增 從右到左 ++ ...
16 前置遞減 從右到左 -- ...
16 typeof 從右到左 typeof ...
16 void 從右到左 void ...
16 delete 從右到左 delete ...
16 await 從右到左 await ...
15 從右到左 ... ** ...
14 乘法 從左到右 ... * ...
14 除法 從左到右 ... / ...
14 取模 從左到右 ... % ...
13 加法 從左到右 ... + ...
13 減法 從左到右 ... - ...
12 按位左移 從左到右 ...<<...
12 按位右移 從左到右 ...>>...
12 無符號右移 從左到右 ...>>>...
11 小於 從左到右 ...<...
11 小於等於 從左到右 ...<=...
11 大於 從左到右 ...>...
11 大於等於 從左到右 ...>=...
11 in 從左到右 ... in ...
11 instanceof 從左到右 ... instanceof ...
10 等號 從左到右 ...==...
10 非等號 從左到右 ...!=...
10 全等號 從左到右 ...===...
10 非全等號 從左到右 ...!==...
9 按位與 從左到右 ...&...
8 按位異或 從左到右 ...^...
7 按位或 從左到右 ... | ...
6 邏輯與 從左到右 ... && ...
5 邏輯或 從左到右 ... || ...
4 條件運算符 從右到左 ... ? ... : ...
3 賦值 從右到左 ...=...
...+=...
...-=...
...*=...
.../=...
...%=...
...<<=...
...>>=...
...>>>=...
...&=...
...^=...
...|=...
2 yield 從右到左 yield ...
2 yield* 從右到左 yield* ...
1 展開運算符 n/a ......
0 逗號 從左到右 ...,..

4. 實現原理

聰明的你,一定能發現.二進制實現好像有漏洞,假如我要0到4呢,通過上邊的算法,得到結果全是0或4.所以這個和上篇一樣一樣有一個確權操作.這個權值必須滿足二進制位全爲1,所以能實現循環計數,有如下規律

2^0^=1
2^1^+2^0^=3
2^2^+2^1^+2^0^=7
2^3^+2^2^+2^1^+2^0^=15
....

這樣計數的原理,主要利用二進制與運算特性以及位運算溢出實現置0操作.所有這個不僅有權值的侷限性,還和操作系統位數有關係.所以,要使用這種方法,還是根據當前業務具體考慮是否可行.

5. 總結

知識雖小,重在積累.2020註定是不平凡的一年.加油!!

歡迎感興趣的朋友關注我的訂閱號“小院不小”,或點擊下方二維碼關注。我將多年開發中遇到的難點,以及一些有意思的功能,體會都會一一發布到我的訂閱號中
訂閱號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章