1. 程式人生 > >二進位制妙用之迴圈計數

二進位制妙用之迴圈計數

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

javastatic的

正在做的專案,有一個需求中,需要把從伺服器請求得到的資料,獲取並展示到前臺頁面; 我的做法是:將從伺服器得到的資料,存入到private static StringBuffer buffer = ne

JAVA8Optional解決NPE問題

例子1: //傳統寫法 if (user != null){ // TODO: do something } //java8寫法 Optional.ofNullable(user).ifPresent(u->{ // TODO: do someth

web前端經典教程偽類

    今天我想說一下偽類當中的:before和:after, 這兩位仁兄一前一後的作用,真是不容小覷哈,除了常見的清除浮動,還可以做一些邊角動畫,後面還發現配合display還可以非常神奇的佈局,尤其是解決解析度多樣的移動端定位問題,非常有效,用得好就不用JavaScript來

Androidstring.valueOf

對比以下兩個例子:例子1: String key = null; String aa = new StringBuilder(key).append("balance").toString(); Sys

Spark StreamingforeachRDD和foreachPartition

0. 前言   DStream中的foreachRDD是一個非常強大函式,它允許你把資料傳送給外部系統。因為輸出操作實際上是允許外部系統消費轉換後的資料,它們觸發的實際操作是DStream轉換。所以要掌握它,對它要有深入瞭解。下面有一些常用的錯誤需要理解。經常

c語言入門專案3.7——for迴圈輸出一個等腰直角三角形

編譯程式碼 /*********************** **專案【3.7】輸出一個等腰三角形** **題目:利用for迴圈巢狀輸出用*號組成的三角形** **作者:李坤** **********

androidItent.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,類模版和函式模版中只能含固定數量的模版引數,可變模版引數無疑是一個巨大的改進。然而由於可變模版引數比較抽象

Pythondict的

  眾所周知,Python的語法裡沒有像C語言中的switch…case…語法結構,所以有時候當我們想要用這個語法時不免捉急。不過不用怕,Python的dict資料結構有時能夠很好地幫助我們實現switch…case…結構。   我們以下面一段程式為例來說明: