91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

js位運算在實際中如何使用

發布時間:2022-03-17 13:31:43 來源:億速云 閱讀:135 作者:iii 欄目:開發技術

這篇文章主要介紹了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

    附:位運算的綜合應用

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

    不能用加減乘除,意思就是要你用位運算進行計算。以實際例子說明,如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位運算在實際中如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    js
    AI

    黄大仙区| 鄂尔多斯市| 三都| 友谊县| 闸北区| 偏关县| 托克托县| 东丽区| 璧山县| 鄂托克旗| 滨州市| 家居| 怀集县| 长白| 洞头县| 呈贡县| 德清县| 中牟县| 滦南县| 蓬溪县| 荃湾区| 确山县| 洪泽县| 上栗县| 巴彦淖尔市| 谢通门县| 漠河县| 康保县| 双辽市| 岢岚县| 微博| 玛曲县| 应城市| 色达县| 綦江县| 班玛县| 瑞金市| 昭苏县| 吉安县| 尼勒克县| 偃师市|