位运算
二进制整数的最低位, 即最右位.
二进制整数的最高位, 即最左位.
http://graphics.stanford.edu/~seander/bithacks.html
JavaScript支持通过左移获得的最大幂是30, 超过30结果就会变成0或负数.
2 ** n// 等同于1 << n
Math.floor(n)// 等同于~~n
Math.ceil(n)// 等同于~~n + 1
Math.floor(n)// 等同于~~n - 1
Math.ceil(n)// 等同于~~n
// isOdd(n)if (n % 2) { // ...}// 等同于if (n & 1) { // ...}
无论被交换的两个数的符号如何, 都可以完成交换.
let a = 1let b = 2const temp = bb = aa = temp// 等同于let a = 1let b = 2a = a ^ bb = b ^ aa = a ^ b
https://www.chessprogramming.org/BitScan
~(10011010) // (01100101)
(10010011) & (00111101) // (00010001)
(10010011) | (00111101) // (10111111)
(10010011) ^ (00111101) // (10101110)
(10001010) << 2 // (00101000)
对于有符号类型与无符号类型有不同的结果.
有符号类型的右移结果在不同系统中可能有差异.
无符号类型的右移结果在所有系统中都相同.
有符号类型的右移结果在不同系统中可能有差异.
无符号类型的右移结果在所有系统中都相同.
(10001010) >> 2 // (00100010) 无符号右移
// 乘法number << n // number乘以2的n次幂// 除法number >> n // 如果number为非负值, number除以2的n次幂
掩码是一种利用位运算操作二进制数的方法.
flags = 00001111MASK = 10110110 // 打开所有为1的位flags = flags | MASK // 10111111
flags = 00001111MASK = 10110110 // 关闭所有为1的位flags = flags & ~MASK // 00001001
flags = 00001111MASK = 10110110 // 取反所有为1的位flags = flags ^ MASK // 10111001
flags = 00001111MASK = 00001001 // 检查第1位和第4位是否为1if ((flags & MASK) === MASK) { // 当位的值如掩码预期时为真 ...}
C语言可以使用struct和unsigned int表示一种按二进制位存储的结构, 这在文件操作和网络通信中很有用.
struct box_props { bool opaque: 1; // 开关位 unsigned int fill_color: 3; // 只占3位的值 unsigned int: 4; // 填充位 bool show_border: 1; // 开关位 unsigned int border_color: 3; // 只占3位的值 unsigned int border_style: 2; // 只占2位的值 unsigned int: 2; // 填充位} // 一个长度为16位的结构