参考文献:
https://blog.csdn.net/xuaner8786/article/details/138858747
https://www.runoob.com/typescript/ts-operators.html
位运算符
TypeScript 中的位运算符用于在二进制位级别上操作数字。这些运算符在处理整数和底层系统编程时特别有用。以下是一些使用 TypeScript 位运算符的示例代码:
let a: number = 60; // 二进制表示为 0011 1100
let b: number = 13; // 二进制表示为 0000 1101
// 位与(&)
let c: number = a & b; // 只保留两个数都为 1 的位,结果为 12(0000 1100)
console.log(c); // 输出 12
// 位或(|)
let d: number = a | b; // 只要两个数中任一数为 1 的位,结果就是 1,结果为 61(0011 1101)
console.log(d); // 输出 61
// 位异或(^)
let e: number = a ^ b; // 当两个数相应位不同时结果为 1,相同则为 0,结果为 49(0011 0001)
console.log(e); // 输出 49
// 位非(~)
let f: number = ~a; // 反转每一位,结果取决于数字的长度和表示方式(通常是有符号 32 位整数),这里可能是 -61
console.log(f); // 输出 -61,具体值取决于系统的位表示和整数大小
// 左移(<<)
let g: number = a << 2; // 将 a 的所有位向左移动 2 位,相当于乘以 2^2(4),结果为 240(1111 0000)
console.log(g); // 输出 240
// 右移(>>)
let h: number = a >> 1; // 将 a 的所有位向右移动 1 位,相当于除以 2(并向下取整),结果为 30(0001 1110)
console.log(h); // 输出 30
// 无符号右移(>>>)
let i: number = a >>> 2; // 将 a 的所有位向右移动 2 位,但左侧填充 0 而不是符号位,对于正数等同于 >>
console.log(i); // 输出 15(0000 1111),对于负数,符号位会被丢弃,然后填充 0
请注意,位运算符只能用于整数类型(在 TypeScript 和 JavaScript 中通常是 number 类型,但实际上是按照 32 位或 64 位整数来处理的,具体取决于实现)。
此外,由于位运算符在二进制层面操作,因此结果可能会受到 JavaScript 数字表示的限制(通常是 IEEE 754 双精度浮点数,但在位操作中会被当作 32 位有符号整数处理)。对于非常大的数字或负数,结果可能不符合直观的数学期望。
对于无符号右移运算符 >>>,它总是用 0 来填充左侧空位,不考虑原始数字的符号。这在处理无符号整数或需要保持正数结果时特别有用。
取反~(单独解释)
下面将详细解释位非运算符 ~
的每一步过程。
示例:对数字 5 进行位非操作
1. 将操作数转换为二进制表示
首先,我们需要将十进制数 5 转换为 32 位的二进制表示。
十进制数 5 的二进制表示是:
00000000 00000000 00000000 00000101
2. 对二进制表示的每一位进行取反操作
接下来,我们对每一位进行取反操作,即将 0 变为 1,1 变为 0。
00000000 00000000 00000000 00000101 (原始二进制)
11111111 11111111 11111111 11111010 (取反后的二进制)
3. 将取反后的二进制表示转换回十进制数
取反后的二进制数 11111111 11111111 11111111 11111010
是一个 32 位的有符号整数。为了将其转换回十进制数,我们需要理解二进制补码表示法。
在二进制补码表示法中:
- 最高位(最左边的一位)是符号位:0 表示正数,1 表示负数。
- 负数的补码表示是其绝对值的二进制表示按位取反后加 1。
首先,我们确认这个二进制数是负数,因为最高位是 1。
要将其转换回十进制数,我们需要进行以下步骤:
- 取反:将
11111111 11111111 11111111 11111010
按位取反,得到00000000 00000000 00000000 00000101
。 - 加 1:在取反结果的基础上加 1,得到
00000000 00000000 00000000 00000110
。
这个二进制数 00000000 00000000 00000000 00000110
的十进制表示是 6。
由于我们最初的二进制数是负数,所以最终结果是 -6。
结论
通过上述步骤,我们可以得出:
~5 = -6
数学公式
实际上,位非运算符 ~
的结果可以用以下公式表示:
~n = -(n + 1)
应用这个公式:
~5 = -(5 + 1) = -6
代码示例
const a = 5;
const b = ~a;
console.log(b); // 输出 -6
小结
- 步骤 1:将十进制数转换为 32 位二进制表示。
- 步骤 2:对二进制表示的每一位进行取反操作。
- 步骤 3:将取反后的二进制表示转换回十进制数。
位非运算符 ~ 将一个数的每一位取反,并返回结果。在 TypeScript 中,这个操作的结果实际上是 -(n + 1)。