您好,登錄后才能下訂單哦!
這篇文章主要介紹了js位運算在實際中如何使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇js位運算在實際中如何使用文章都會有所收獲,下面我們一起來看看吧。
從現代計算機中所有的數據二進制的形式存儲在設備中。即 0、1 兩種狀態,計算機對二進制數據進行的運算(+、-、*、/)都是叫位運算,即將符號位共同參與運算的運算。
按位運算符有6個
&: 按位與\
|: 按位或\
^: 按位異或\
~: 按位取反\
>> : 右移\
<<: 左移
我們大部分的業務開發場景下 只用if else 或 switch 條件處理就可以,但是當有如下場景:
一個ci/cd 任務有: 1.等待中 -> 2.base image1 build完成 -> 3.base image2 build 完成 -> 4. base image3 build完成 -> 5.完成/失敗
當我們查詢狀態時:有可能出現這樣的情況:任務處于 base image2 build 完成 但是我們查詢base image1 build 完成時該任務也應被查詢出來。
任務處于完成狀態,等我們查詢 base image3 build完成 時該任務也應被查詢出來
是不是我們在數據庫中存儲的狀態枚舉值就比較麻煩?
那么這時位運算就比較合適,定義如下枚舉:
{ waiting: 0b000001, image1Finish: 0b000010, image2Finish 0b000100, image3Finish 0b001000, finish: 0b010000, fail: 0b100000, }
那么 上面的 [第 1 種] 情況就可以表示為:0b000001| 0b000010 | 0b000100 (waiting|image1Finish | image2Finish) 按位或
等我們判斷是否是處于 image2Finish 的時候 就可以 status & image2Finish === image2Finish 這樣判斷 。
status = 0b000001| 0b000010 | 0b000100 = 0b000111 status & image2Finish = 0b000111 & 0b000100 = 0b000100(image2Finish)
這樣是不是很好判斷? 同時提高了自己的代碼逼格?減少很多 if else 的書寫
其實還有另外一種做法就是 質數 表示法:
{ waiting: 3, image1Finish: 5, image2Finish 7, image3Finish 11, finish: 13, fail: 17, }
同樣是上面的第一個情況:
status = 3 * 5 * 7 // 判斷狀態: 取模運算 isImage2Finish = status % 7(image2Finish) === 0
這里有個例子——不使用加減乘除來做加法,經常用來考察對位運算的掌握情況。讀者可以先自行嘗試分析和實現。
不能用加減乘除,意思就是要你用位運算進行計算。以實際例子說明,如a = 81 = 0b1010001,b = 53 = 0b0110101。通過異或運算,我們發現異或把兩個數相加但是不能進位,而通過與運算能夠知道哪些位需要進位,如下所示:
1010001 ^ 0110101 --------- 1100100 1010001 & 0110101 --------- 0010001
把通過與運算得到的值向左移一位,再和通過異或得到的值相加,就相當于實現了進位,這個應該不難理解。為了實現這兩個數的相加可以再重復這個過程:先異或,再與,然后進位,直到不需要再進位了就加完了。所以不難寫出以下代碼:
function addByBit(a, b) { if (b === 0) { return a; } // 不用進位的相加 let c = a ^ b; // 記錄需要進位的 let d = a & b; d = d << 1; // 繼續相加,直到d進位為0 return addByBit(c, d); } let ans = addByBit(5, 8); console.log(ans);
位運算還經常用于生成隨機數、哈希,例如Chrome對字符串進行哈希的算法是這樣的:
uint32_t StringHasher::AddCharacterCore(uint32_t running_hash, uint16_t c) { running_hash += c; running_hash += (running_hash << 10); running_hash ^= (running_hash >> 6); return running_hash; }
不斷對當前字符串的ASCII值進行累加運算,里面用到了異或,左移和右移。
關于“js位運算在實際中如何使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“js位運算在實際中如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。