二進位制妙用之迴圈計數
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註定是不平凡的一年.加油!!
歡迎感興趣的朋友關注我的訂閱號“小院不小”,或點選下方二維碼關注。我將多年開發中遇到的難點,以及一些有意思的功能,體會都會一一發布到我的訂閱號中
相關推薦
二進位制妙用之迴圈計數
1. 什麼是迴圈計數 從0到n之間迴圈依次取數,假設 n=3,那麼我需要的如下資料 0,1,2,3,0,1,2...;現象就這樣,我也不知道迴圈計數這個名詞是否合適.姑且,就認為合適吧. 2. 常規實現 這點需求,相信對於所有的coder都小菜一碟.我們愉快的寫下如下程式碼 // author: herber
C語言在linux內核中do while(0)妙用之法
pos turn jsb world div fprintf cpp efault code 為什麽說do while(0) 妙?由於它的確就是妙,並且在linux內核中實現是相當的妙,我們來看看內核中的相關代碼: #define db_error(fmt, ..
Android圖層妙用之layer-list的基本使用介紹
1. layer-list 是啥?有啥作用? 1.1 layer-list 是什麼? 簡單理解,layer 是層,list 是列表,那麼 layer-list 就是層列表的意思。但是,是什麼層列表呢?? 其實 layer-list 是用來建立 L
Javascript中陣列方法reduce的妙用之處
Javascript陣列方法中,相比map、filter、forEach等常用的迭代方法,reduce常常被我們所忽略,今天一起來探究一下reduce在我們實戰開發當中,能有哪些妙用之處,下面從reduce語法開始介紹。 語法 array.reduce(function(accumulator, arra
linux命令之文件篩選妙用
篩選 -i ces 分享圖片 roc 命令 匹配 找文件 term 當我們只想要顯示文件夾的時候,往往可以這樣 。。。。首先,得有這樣的一個 環境。第一種方式(使用grep命令來過濾): 命令:ls -l|grep d命令:ls -lF|grep /$第二種方式(使用awk
Jmeter(三十)Jmeter Question 之 循環+事務的妙用
事務 分享 目錄結構 觀察 技術 log 服務器 實的 pos 先提一個小問題,也是當時在對Jmeter還是懵懂之時,親身碰到過的一個問題。 真實的業務場景---“登錄一次,提交訂單N次”,當然該處是兩個接口。 提現接口是需要判斷用戶是否在線,換句話說,服務器需
JS異步執行之setTimeout 0的妙用
圖片 工作 focus body 事件 dom元素 音樂播放器 function utf-8 最近在工作中遇到一些問題,大致是關於js執行問題的。由於沒搞清執行順序,導致出現了一些奇怪的bug。 所以這裏整理一些有關異步執行的知識(冰山一角角)... 大家都知道js
妙用修辭之排山倒海,信手拈來
展鴻公職考試中心成立於2001年,是一家專注於國家公務員考試(http://www.gwyks.cn/html/gwy)考前輔導培訓和書籍研發的機構。專業的師資團隊、創新實效的課程模式,真心關懷的服務理念,選擇展鴻,助您成公! 文章寫作,一直是公考求索路上一隻
URAL2014C之妙用線段樹
題意: 題目中的小明呢,會賺錢和花錢,花錢的時候會先花掉自己賺的錢,再去花老爸的信用卡,要注意小明不會存錢進去。現在小明每賺一次錢或者花一次錢,都會寫一封信告訴老爸花了多少或者賺了多少,如果是用了老爸的信用卡,老爸就會記下來。但是收到信的順序和實際小明花錢的
linux mac svn ignore忽略檔案及資料夾最好用方法 之*妙用
一、忽略單個檔案 忽略檔案必須要進入到檔案的當前目錄,比如要忽略這個database.php配置檔案。 先進入application資料夾,輸入兩條命令語法如下: svn propset svn:ignore '要忽略的檔名' ./ svn ci -m 'ignore
JS 陣列中有 undefined 值,用 for 迴圈和 for…in 迴圈遍歷的不同之處
先說結論:在陣列遍歷時一般最好使用for迴圈遍歷 var arr=new Array(); arr[0]="P90"; arr[3]="AWM"; arr[5]="AK47"; console.log("//for 迴圈遍歷"); for(let i=0;i<arr
java之static的妙用
正在做的專案,有一個需求中,需要把從伺服器請求得到的資料,獲取並展示到前臺頁面; 我的做法是:將從伺服器得到的資料,存入到private static StringBuffer buffer = ne
JAVA8之妙用Optional解決NPE問題
例子1: //傳統寫法 if (user != null){ // TODO: do something } //java8寫法 Optional.ofNullable(user).ifPresent(u->{ // TODO: do someth
web前端經典教程之偽類妙用
今天我想說一下偽類當中的:before和:after, 這兩位仁兄一前一後的作用,真是不容小覷哈,除了常見的清除浮動,還可以做一些邊角動畫,後面還發現配合display還可以非常神奇的佈局,尤其是解決解析度多樣的移動端定位問題,非常有效,用得好就不用JavaScript來
Android之string.valueOf妙用
對比以下兩個例子:例子1: String key = null; String aa = new StringBuilder(key).append("balance").toString(); Sys
Spark Streaming之妙用foreachRDD和foreachPartition
0. 前言 DStream中的foreachRDD是一個非常強大函式,它允許你把資料傳送給外部系統。因為輸出操作實際上是允許外部系統消費轉換後的資料,它們觸發的實際操作是DStream轉換。所以要掌握它,對它要有深入瞭解。下面有一些常用的錯誤需要理解。經常
c語言入門之專案3.7——用for迴圈輸出一個等腰直角三角形
編譯程式碼 /*********************** **專案【3.7】輸出一個等腰三角形** **題目:利用for迴圈巢狀輸出用*號組成的三角形** **作者:李坤** **********
android之Itent.ACTION_PICK Intent.ACTION_GET_CONTENT妙用
public class TestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
泛化之美--C++11可變模版引數的妙用
1概述 C++11的新特性--可變模版引數(variadic templates)是C++11新增的最強大的特性之一,它對引數進行了高度泛化,它能表示0到任意個數、任意型別的引數。相比C++98/03,類模版和函式模版中只能含固定數量的模版引數,可變模版引數無疑是一個巨大的改進。然而由於可變模版引數比較抽象
Python之dict的妙用
眾所周知,Python的語法裡沒有像C語言中的switch…case…語法結構,所以有時候當我們想要用這個語法時不免捉急。不過不用怕,Python的dict資料結構有時能夠很好地幫助我們實現switch…case…結構。 我們以下面一段程式為例來說明: