There are only two numbers in the world: 0 and 1
先写一个凑齐 32 位的方法吧
因为 log 打印不出来那么多的 0,位运算中的左移啥的看不清楚
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| const binary = (decimal = 0) => { if (decimal.toString(2) >= 0) { let bin = decimal.toString(2); if (bin.length < 32) { let arr = bin.split(' '); let remainStr = `0`.repeat(32 - bin.length); arr.unshift(remainStr); return arr.join(''); } } else { let transformBin = (~decimal).toString(2); if (transformBin.length < 32) { let arr = transformBin.split(' '); let remainStr = `0`.repeat(32 - transformBin.length); arr.unshift(remainStr); let newResult = arr.join('').split(''); var brr = []; for (var i in newResult) { if (newResult[i] == '1') { brr[i] = i; } if (newResult[i] == '0') { newResult[i] = '1'; } } var crr = brr.filter(x => typeof x == 'string').map(y => Number(y)); for (var c in crr) { newResult[crr[c]] = '0'; } return newResult.join(''); } } };
|
Bitwise NOT(~)
1 2 3 4 5 6 7 8 9 10 11
| const a = 25; const b = ~a; const c = -a - 1;
console.time(`b`); console.log(b); console.timeEnd(`b`);
console.time(`c`); console.log(c); console.timeEnd(`c`);
|
位运算更接近底层吧,速度快那么一丢丢
Bitwise AND(&)
两位都是 1 => return 1
1 2 3 4 5 6 7 8 9
| const d = 25; const e = 3; console.log(binary(25)); 00000000000000000000000000011001; console.log(binary(3)); 00000000000000000000000000000011; console.log(binary(d & e)); 00000000000000000000000000000001; console.log(d & e);
|
Bitwise OR(|)
任一位是 1 => return 1
1 2 3 4 5 6 7
| console.log(binary(d)); 00000000000000000000000000011001; console.log(binary(e)); 00000000000000000000000000000011; console.log(binary(d | e)); 00000000000000000000000000011011; console.log(d | e);
|
Bitwise XOR
只有一位是 1 => return 1
1 2 3 4 5 6 7
| console.log(binary(d)); 00000000000000000000000000011001; console.log(binary(e)); 00000000000000000000000000000011; console.log(binary(d ^ e)); 00000000000000000000000000011010; console.log(d ^ e);
|
Left Shift (<<)
所有位左移指定的位数
1 2 3 4 5
| const f = 2; console.log(binary(f)); 00000000000000000000000000000010; console.log(binary(f << 9)); 00000000000000000000010000000000;
|
Signed Right Shift (>>)
符号位保留,其他位指定右移的位数
1 2 3 4 5 6
| console.log(binary(2)); 00000000000000000000000000000010; console.log(binary(64)); 00000000000000000000000001000000; console.log(binary(64 >> 5)); 00000000000000000000000000000010;
|
Unsigned Right Shift (>>>)
所有的位都指定右移的位数
1 2 3 4
| console.log(binary(-64)); 11111111111111111111111111000000; console.log(binary(-64 >>> 5)); 00000111111111111111111111111110;
|