位運算技巧整理
阿新 • • 發佈:2019-01-10
為方便描述, 使用幾個整數n, a, b, k.
常用的幾種運算子號: &
(與), |
(或), ~
(反), ^
(異或), <<
(左移), >>
(右移), >>>
(無符號右移)
-
n左移(
<<
)k位即為 -
n右移(
>>
)k位即為 -
計算2的k次方:
2 << (k-1)
-
計算 (對2的k次方取餘):
n & (m - 1)
(m= ) -
判斷奇偶性
原理: 如果n為奇數, 展開最後一位為1, 否則為0if (n & 1) { // 奇數 } else { // 偶數 }
-
取指定位
比如前端常見的應用, 十六進位制顏色轉十進位制var color = '#ccddee'; var hex = color.substr(1); hex = parseInt('0x' + hex, 16); // RRGGBB var R = (hex >> 16) & 0xff; var G = (hex >> 8) & 0xff; var B = hex & 0xff; console.log(R, G, B); // 204 221 238 console.log('#' + R.toString(16) + G.toString(16) + B.toString(16)); // #ccddee
-
使用異或交換兩個整數。
a = a ^ b; b = a ^ b; a = a ^ b;
-
n & (n - 1)將整數n的最後一位為1的位變成0
- 統計n的二進位制表示中1的個數
int getOnes(int n) { int count = 0; while (n) { n = n & (n - 1); ++count; } return count; }
- 判斷是不是2的整數次冪(參見我的另一篇文章)
int judge(int n){ if n <= 0 { return 0; } return n & (n-1) == 0 ? 1 : 0; }
-
取相反數:
n = ~n + 1
歡迎補充指正!