20個你不得不知道的js位運算用法
位運算的奇妙應(yīng)用
1. 乘法和除法運算
位運算可實現(xiàn)乘法和除法的簡易版本,如num << 1
(乘2),num >> 1
(除2)。
let num = 4; let multiplied = num << 1; // 結(jié)果為8 let divided = num >> 1; // 結(jié)果為2
2. 判斷奇偶性
通過和1的與運算檢查最低位,判斷數(shù)值的奇偶性。
let num = 7; let isOdd = num & 1; // 結(jié)果為1,奇數(shù)
3. 交換變量
利用異或運算交換兩個變量的值,無需額外空間。
let a = 2, b = 3; a ^= b; b ^= a; a ^= b; // a === 3, b === 2
4. 取絕對值
使用位運算取整數(shù)的絕對值。
let num = -6; let abs = (num ^ (num >> 31)) - (num >> 31); // 結(jié)果為6
5. 檢測數(shù)值是否為2的冪
檢測一個數(shù)是否為2的冪可以通過判斷其是否只有一個位是1。
let num = 8; let isPowerOfTwo = (num & (num - 1)) === 0; // 結(jié)果為true
6. 輪轉(zhuǎn)位
通過位運算實現(xiàn)位的循環(huán),左輪或右輪。
let num = 21; // (10101) num = (num >> 3) | (num << (32 - 3)); // 右輪轉(zhuǎn)3位
7. 快速計算
快速計算n2n,等同于n << n
。
let n = 5; let result = 5 << 5; // 結(jié)果為160
8. 掩碼運算
使用掩碼進(jìn)行位運算,快速提取片段中的信息。
// 使用掩碼獲取RGB顏色的紅色分量 let color = 0xffeEDC; let red = (color & 0xff0000) >> 16;
9. 快速杜敏運算
利用異或運算實現(xiàn)一次杜敏運算,即不改變其他位的情況下翻轉(zhuǎn)特定位。
let flags = 5; // (101) let mask = 2; // (010) flags ^= mask; // 結(jié)果為7 (111)
10. 利用掩碼來設(shè)置位
設(shè)置特定位為1而不影響其他位。
let num = 4; // (100) num |= 2; // 結(jié)果為6 (110)
11. 利用掩碼來清零位
通過與運算將特定位清零。
let num = 15; // (1111) num &= ~8; // 結(jié)果為7 (0111)
12. 低效的按位非運算
通過按位非運算實現(xiàn)變量值減1。
let num = 10; num = ~num; // 結(jié)果為-11
13. 條件無分支
實現(xiàn)條件判斷無需if語句,適用于某些性能敏感的場合。
let a = 10, b = 20; let max = a - ((a - b) & ((a - b) >> 31));
14. 檢測位是否被置位
檢測某一位是否為1。
let flag = 8; // (1000) let isSet = flag & (1 << 3); // 結(jié)果為8,表示第3位被置位
15. 浮點數(shù)轉(zhuǎn)整數(shù)
通過零填充右移將浮點數(shù)向下取整。
let floatNum = 3.9; let intNum = floatNum >> 0; // 結(jié)果為3
16. RGB顏色混合
通過位運算實現(xiàn)簡易的RGB顏色值混合。
let color1 = 0xff00ff, color2 = 0x00ff00; let mixed = (color1 & color2) + (((color1 ^ color2) & 0xfefefe) >> 1);
17. 模2^n取余
利用位運算快速取模2的冪。
let num = 19; let mod = num & (8 - 1); // 結(jié)果為3,相當(dāng)于19 % 8
18. 實現(xiàn)布爾數(shù)組
使用位運算實現(xiàn)高效的布爾數(shù)組,節(jié)約空間。
let array = 0; array |= 1 << index; // 設(shè)置index位置為1 let isTrue = (array & (1 << index)) !== 0; // 檢測index位置是否為1
19. 求相反數(shù)
通過位運算獲取一個數(shù)的相反數(shù)。
let num = -48; let opposite = ~num + 1; // 結(jié)果為48
20.計算漢明權(quán)重
計算一個數(shù)二進(jìn)制表示中1的個數(shù)(漢明權(quán)重)。
let num = 13; // (1101) let count = 0; while(num) { count++; num &= num - 1; // 清除最低位的1 } // 結(jié)果 count 為3
以上就是20個你不得不知道的js位運算用法的詳細(xì)內(nèi)容,更多關(guān)于js位運算用法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
selenium 反爬蟲之跳過淘寶滑塊驗證功能的實現(xiàn)代碼
這篇文章主要介紹了selenium 反爬蟲之跳過淘寶滑塊驗證功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08JS獲取html元素的標(biāo)記名實現(xiàn)方法
下面小編就為大家?guī)硪黄狫S獲取html元素的標(biāo)記名實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10JavaScript?中的?this?綁定規(guī)則詳解
這篇文章主要介紹了JavaScript?中的?this?綁定規(guī)則詳解的相關(guān)資料,需要的朋友可以參考下2023-02-02深入探討JavaScript、JQuery屏蔽網(wǎng)頁鼠標(biāo)右鍵菜單及禁止選擇復(fù)制
這篇文章主要介紹了深入探討JavaScript、JQuery屏蔽網(wǎng)頁鼠標(biāo)右鍵菜單及禁止選擇復(fù)制,需要的朋友可以參考下2014-06-06