中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

    仁布县| 信丰县| 盖州市| 科技| 古交市| 喀喇沁旗| 千阳县| 湖南省| 鄂尔多斯市| 汝城县| 东山县| 泸西县| 克东县| 德化县| 玉门市| 大姚县| 且末县| 丹东市| 宝应县| 新郑市| 大余县| 逊克县| 霍林郭勒市| 涟水县| 兴隆县| 延庆县| 剑川县| 广河县| 新蔡县| 冀州市| 镇康县| 新沂市| 黄大仙区| 揭西县| 洞头县| 瑞安市| 河北区| 莒南县| 水城县| 浮梁县| 凤凰县|