【JS】逻辑位运算符和移位运算符

288 阅读4分钟

参考

逻辑位运算符

位与 &

// 规则:
1 & 1; // 1
1 & 0; // 0
0 & 1; // 0
0 & 0; // 0

// 示例:
//  12 = 00000000 00000000 00000000 00001100
//   5 = 00000000 00000000 00000000 00000101
// ret = 00000000 00000000 00000000 00000100 = 4
12 & 5; // 4

位或 |

// 规则:
1 | 1; // 1
1 | 0; // 1
0 | 1; // 1
0 | 0; // 0

// 示例:
//  12 = 00000000 00000000 00000000 00001100
//   5 = 00000000 00000000 00000000 00000101
// ret = 00000000 00000000 00000000 00001101 = 13
12 | 5; // 13

位异或 ^

// 规则:
1 ^ 1; // 0
1 ^ 0; // 1
0 ^ 1; // 1
0 ^ 0; // 0

// 示例:
//  12 = 00000000 00000000 00000000 00001100
//   5 = 00000000 00000000 00000000 00000101
// ret = 00000000 00000000 00000000 00001001 = 9
12 ^ 5; // 9

位非 ~

// 规则:
~0; // 1
~1; // 0

// 示例:
//  12 = 00000000 00000000 00000000 00001100
// ret = 11111111 11111111 11111111 11110011 = -13
~12; // -13

移位运算符

零填充左位移 <<

// 规则:
// 指定个0数位从右被推入,最左侧的数位被移除

// 示例1:
//   5 = 00000000 00000000 00000000 00000101
// ret = 00000000 00000000 00000000 00001010 = 10
5 << 1; // 10

// 示例2:
// -12 = 11111111 11111111 11111111 11110100
// ret = 11111111 11111111 11111111 11101000 = -24
-12 << 1; // -24

// 示例3:
// 1073741824 = 01000000 00000000 00000000 00000000
//        ret = 10000000 00000000 00000000 00000000 = -2147483648
1073741824 << 1; // -2147483648

// 示例4:
// 2147483647 = 01111111 11111111 11111111 11111111
//        ret = 11111111 11111111 11111111 11111110 = -2
2147483647 << 1; // -2

零填充右位移 >>>

// 规则:
// 指定个0数位从左被推入,最右侧的数位被移除

// 示例1:
//   5 = 00000000 00000000 00000000 00000101
// ret = 00000000 00000000 00000000 00000010 = 2
5 >>> 1; // 2

// 示例2:
// -12 = 11111111 11111111 11111111 11110100
// ret = 01111111 11111111 11111111 11111010 = 2147483642
-12 >>> 1; // 2147483642

// 示例3:
// 2147483647 = 01111111 11111111 11111111 11111111
//        ret = 00111111 11111111 11111111 11111111 = 1073741823
2147483647 >>> 1; // 1073741823

有符号右位移 >>

// 规则:
// 指定个0数位从左被推入,最右侧的数位被移除,
// 最后用原符号位填充最左侧的数位

// 示例1:
//   5 = 00000000 00000000 00000000 00000101
// mid = 00000000 00000000 00000000 00000101
// ret = 00000000 00000000 00000000 00000010 = 2
5 >> 1; // 2

// 示例2:
// -12 = 11111111 11111111 11111111 11110100
// mid = 01111111 11111111 11111111 11110100
// ret = 11111111 11111111 11111111 11111010 = -6
-12 >> 1; // -6

// 示例3:
// 2147483647 = 01111111 11111111 11111111 11111111
//        mid = 00111111 11111111 11111111 11111111
//        ret = 00111111 11111111 11111111 11111111 = 1073741823
2147483647 >> 1; // 1073741823

// 示例4:
// -2147483647 = 10000000 00000000 00000000 00000001
//         mid = 01000000 00000000 00000000 00000000
//         ret = 11000000 00000000 00000000 00000000 = -1073741824
-2147483647 >> 1; // 1073741823