位運算優先級code
( + - ) > ( << >> ) > ( ~ & ^ | )
var x = 18; // 10010 // 取右邊第k位 // x >> (k - 1) & 1 console.log(x >> (2 - 1) & 1); // 1 // 把右邊第k位變爲0 // x & ~(1 << (k - 1)) console.log(x & ~(1 << (2 - 1))); // 16 // 把右邊第k位變爲1 // x | (1 << (k - 1)) console.log(x | (1 << (1 - 1))); // 19 // 把右邊第k位取反 // x ^ (1 << (k - 1)) console.log(x ^ (1 << (3 - 1))); // 22
var x = 18; // 10010 // 求末k位 // x & (1 << k) - 1 console.log(x & (1 << 3) - 1); // 2 // 把末k位變0 // x & ~((1 << k) - 1) console.log(x & ~((1 << 3) - 1)); // 16 // 把末k位變1 // x | (1 << k) - 1 console.log(x | (1 << 4) - 1); // 31 // // 把末k位取反 // x ^ (1 << k) - 1 console.log(x ^ (1 << 4) - 1); // 29
var x = 19; // 10011 // 把右邊連續的1變爲0 // x & (x + 1) console.log(x & (x + 1)); // 16 // 取右邊連續的1 // (x ^ (x + 1)) >> 1 console.log((x ^ (x + 1)) >> 1); // 3 var y = 16; // 10000 // 把右邊連續的0變爲1 // x | (x - 1) console.log(y | (y - 1)); // 31 // 去除右邊連續的0 var a = 40; // 101000 a = a >> (Math.log(a & (-a)) / Math.log(2)); console.log(a); // 5 (101)
var x = 18; // 10010 // 把右邊第一個1變爲0 // x & (x - 1) console.log(x & (x - 1)); // 16 // 取出右邊第一個1 // x & (-x) console.log(x & (-x)); // 2 // 把右邊第一個0變爲1 // x | (x + 1) console.log(x | (x + 1)); // 19
// 乘2的冪 除2的冪 console.log(63 >> 1); // 31 console.log(1 << 4); // 16 // 判斷奇偶 var a = 10; console.log(a & 1); // 0偶 1奇 // 小數向下取整 var b = 1.25 , c = -1.25; console.log(b | 0); // 1 console.log(~~b); // 1 console.log(b << 0); // 1 console.log(b >> 0); // 1 console.log(c | 0); // -1 console.log(~~c); // -1 console.log(c << 0); // -1 console.log(c >> 0); // -1 // 交換數字 var a = 10, b = 20; a = a ^ b; b = a ^ b; a = a ^ b; console.log(a, b); // 20 10 // 正負轉換 var a = 10, b = -5; console.log(~a + 1); // -10 console.log(~b + 1); // 5 console.log((a ^ -1) + 1); // -10 console.log((b ^ -1) + 1); // -5 // 模2的冪 var a = 153; console.log(a % 16); // 9 console.log(a & (1 << 4) - 1); // 9 // 判斷兩數符號是否相同 (注意有0的狀況) var sign = a * b > 0; var sign = (a ^ b) > 0; // 取絕對值 // 寫法1 i = x < 0 ? -x : x; // 寫法2 i = (x ^ (x >> 31)) - (x >> 31); // 寫法3 i= x ^ ( ~(x >> 31) + 1) + (x >> 31); // 判斷是否是2的冪 var isPowerOfTwo = function(n) { return (!(n & (n - 1)) && n > 0); };
0xAAAAAAAA 10101010101010101010101010101010 0x55555555 01010101010101010101010101010101 0xCCCCCCCC 11001100110011001100110011001100 0x33333333 00110011001100110011001100110011 0xF0F0F0F0 11110000111100001111000011110000 0x0F0F0F0F 00001111000011110000111100001111 0xFF00FF00 11111111000000001111111100000000 0x00FF00FF 00000000111111110000000011111111 0xFFFF0000 11111111111111110000000000000000 0x0000FFFF 00000000000000001111111111111111
枚舉出一個集合的子集。設原集合爲mask,則下面的代碼就能夠列出它的全部子集:io
var mask = 5; // 1101 for (i = mask; i; i = (i - 1) & mask) { console.log(i); // 5 4 1 }