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,所以能實現循環計數,有如下規律
20=1
21+20=3
22+21+20=7
23+22+21+20=15
....
這樣計數的原理,主要利用二進制與運算特性以及位運算溢出實現置0操作.所有這個不僅有權值的局限性,還和操作系統位數有關系.所以,要使用這種方法,還是根據當前業務具體考慮是否可行.
5. 總結
知識雖小,重在積累.2020注定是不平凡的一年.加油!!
歡迎感興趣的朋友關注我的訂閱號“小院不小”,或點擊下方二維碼關注。我將多年開發中遇到的難點,以及一些有意思的功能,體會都會一一發布到我的訂閱號中