最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js位運算在實際中使用的實例教程

 更新時間:2022年03月17日 10:47:37   作者:猴賽雷  
我們可能很少在編程中用位運算,如果沒深入學習,可能也很難理解,下面這篇文章主要給大家介紹了關于js位運算在實際中使用的相關資料,需要的朋友可以參考下

什么是位運算?

從現代計算機中所有的數據二進制的形式存儲在設備中。即 0、1 兩種狀態(tài),計算機對二進制數據進行的運算(+、-、*、/)都是叫位運算,即將符號位共同參與運算的運算。

按位運算符有6個

&: 按位與\
|: 按位或\
^: 按位異或\
~: 按位取反\
>> : 右移\
<<: 左移

業(yè)務場景:

我們大部分的業(yè)務開發(fā)場景下 只用if else 或 switch 條件處理就可以,但是當有如下場景:

一個ci/cd 任務有: 1.等待中 -> 2.base image1 build完成 -> 3.base image2 build 完成 -> 4. base image3 build完成 -> 5.完成/失敗
當我們查詢狀態(tài)時:有可能出現這樣的情況:

任務處于 base image2 build 完成 但是我們查詢base image1 build 完成時該任務也應被查詢出來。

任務處于完成狀態(tài),等我們查詢 base image3 build完成 時該任務也應被查詢出來

是不是我們在數據庫中存儲的狀態(tài)枚舉值就比較麻煩?

解決辦法

辦法一:

那么這時位運算就比較合適,定義如下枚舉:

{
    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
// 判斷狀態(tài): 取模運算
isImage2Finish = status % 7(image2Finish) === 0

附:位運算的綜合應用

這里有個例子——不使用加減乘除來做加法,經常用來考察對位運算的掌握情況。讀者可以先自行嘗試分析和實現。

不能用加減乘除,意思就是要你用位運算進行計算。以實際例子說明,如a = 81 = 0b1010001,b = 53 = 0b0110101。通過異或運算,我們發(fā)現異或把兩個數相加但是不能進位,而通過與運算能夠知道哪些位需要進位,如下所示:

 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;
    // 繼續(xù)相加,直到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值進行累加運算,里面用到了異或,左移和右移。

總結

綜上: 當我們的業(yè)務開發(fā)中遇到狀態(tài)數 >=5 并且有交叉重疊的時候就需要考慮以上兩種辦法了。

到此這篇關于js位運算在實際中使用的文章就介紹到這了,更多相關js位運算使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • js 能實現監(jiān)聽F5頁面刷新子iframe 而父頁面不刷新的方法

    js 能實現監(jiān)聽F5頁面刷新子iframe 而父頁面不刷新的方法

    下面小編就為大家?guī)硪黄猨s 能實現監(jiān)聽F5頁面刷新子iframe 而父頁面不刷新的方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 微信小程序開發(fā)指南之圖片壓縮解決方案

    微信小程序開發(fā)指南之圖片壓縮解決方案

    在項目開發(fā)過程中遇到一個需要從小程序上傳圖片的需求,此需求實現起來并不難,下面這篇文章主要給大家介紹了關于微信小程序開發(fā)指南之圖片壓縮解決方案的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 使用coffeescript編寫node.js項目的方法匯總

    使用coffeescript編寫node.js項目的方法匯總

    Node.js 基于JavaScript編寫應用,JavaScript是我的主要開發(fā)語言。CoffeeScript是編譯為JavaScript的編程語言。CoffeeScript是一個非常高階的語言,將JavaScript、Ruby和Python中我最愛的部分結合在了一起。小編給大家介紹下使用coffeescript編寫node.js項目的方法
    2015-08-08
  • layui動態(tài)加載多表頭的實例

    layui動態(tài)加載多表頭的實例

    今天小編就為大家分享一篇layui動態(tài)加載多表頭的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JavaScript中的console.profile()函數詳細介紹

    JavaScript中的console.profile()函數詳細介紹

    這篇文章主要介紹了JavaScript中的console.profile()函數詳細介紹,本文講解了console.profile()函數的瀏覽器支持情況、console.profile()的使用、Firebug中Profile按鈕的使用等內容,需要的朋友可以參考下
    2014-12-12
  • javascript各種復制代碼收集

    javascript各種復制代碼收集

    javascript各種形式的復制代碼效果,有直接復制url,復制文本框中的內容、隱藏表單中的內容,復制span中的內容
    2008-09-09
  • JS實現iframe中子父頁面跨域通訊的方法分析

    JS實現iframe中子父頁面跨域通訊的方法分析

    這篇文章主要介紹了JS實現iframe中子父頁面跨域通訊的方法,結合實例形式分析了JS實現iframe頁面跨域通訊常見操作技巧與相關注意事項,需要的朋友可以參考下
    2020-03-03
  • 訪問百度和谷歌網速測試的javascript代碼

    訪問百度和谷歌網速測試的javascript代碼

    訪問百度和谷歌網速測試的javascript代碼...
    2007-08-08
  • Javascript模板技術

    Javascript模板技術

    Javascript模板技術...
    2007-04-04
  • 微信小程序 實例開發(fā)總結

    微信小程序 實例開發(fā)總結

    這篇文章主要介紹了微信小程序 開發(fā)過程中遇到問題總結的相關資料,需要的朋友可以參考下
    2017-04-04

最新評論

井冈山市| 哈巴河县| 梁山县| SHOW| 于田县| 曲水县| 永胜县| 乡城县| 江源县| 尼勒克县| 罗江县| 应城市| 亚东县| 嵊州市| 元谋县| 定日县| 子长县| 丘北县| 孟村| 松桃| 庄河市| 搜索| 通江县| 广河县| 全椒县| 安吉县| 同德县| 隆回县| 濮阳县| 文登市| 富川| 增城市| 奉新县| 龙江县| 岳池县| 巫山县| 东安县| 长岭县| 云安县| 丰台区| 塔河县|