# 巧用 JS 位运算

# 取整

  • 可以采用 >> 0| 来进行取整操作
console.log(1.01 >> 0) // 1
console.log(1.01 | 0) // 1
console.log(-1.01 >> 0) // -1
console.log(-1.01 | 0)  // -1
console.log(2.23123 >> 0)  // 2
console.log(2.23123 | 0)  // 2
console.log(-2.23123 >>  0 )  // -2 
console.log(-2.23123 |  0 )  // -2 
1
2
3
4
5
6
7
8
  • 移位0有什么意义

查过一些资料,其中stackoverflow里面有一个高票回答 (opens new window),里面有这么一句话

回答

It doesn't just convert non-Numbers to Number, it converts them to Numbers that can be expressed as 32-bit unsigned ints.

原来移位操作符在移位前做了两种转换,第一将不是number类型的数据转换为number,第二将number转换为无符号的32bit数据,也就是Uint32类型。这些与移位的位数无关,移位0位主要就是用了js的内部特性做了前两种转换。

  • Uint32类型是如何转换的

1 . 如果不能转换为Number,那就为0 2 . 如果为非整数,先转换为整数,参考公式sign(n) ⋅ floor(abs(n))

function ToInteger(x) {
    x = Number(x);
    return x < 0 ? Math.ceil(x) : Math.floor(x);
}
1
2
3
4

3 . 如果是正数,返回正数,如果是负数,返回负数 + 2的32次方

function modulo(a, b) {
    return a - Math.floor(a/b)*b;
}
function ToUint32(x) {
    return modulo(ToInteger(x), Math.pow(2, 32));
}
1
2
3
4
5
6

# 参考文献

Last Updated: 3/4/2024, 3:06:40 PM