用JS的二进制位运算符来取整
用JS的二进制位运算符来取整
二进制位运算符介绍
- 二进制或运算符(or):符号为
|
,表示若两个二进制位都为0
,则结果为0
,否则为1
。 - 二进制与运算符(and):符号为
&
,表示若两个二进制位都为1,则结果为1,否则为0。 - 二进制否运算符(not):符号为
~
,表示对一个二进制位取反。 - 异或运算符(xor):符号为
^
,表示若两个二进制位不相同,则结果为1,否则为0。 - 左移运算符(left shift):符号为
<<
,表示将一个数的二进制值连着符号位向左移,末尾补0 - 右移运算符(right shift):符号为
>>
,表示将一个数的二进制值连着符号位向右移,正数头部补0,负数头部补1 - 头部补零的右移运算符(zero filled right shift):符号为
>>>
,表示将一个数的二进制值连着符号位向右移,不管是正数负数都补0
这些位运算符直接处理每一个比特位(bit),所以是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能使用它们,否则会使代码难以理解和查错。
为什么二进制运算符能取整
位运算符只对整数起作用,如果一个运算子不是整数,会自动转为整数后再执行。另外,虽然在 JavaScript 内部,数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数。
二进制运算符取整的具体写法
// 二进制或运算符
1.2 | 0 //1
// 二进制与运算符
1.2 & 1 //1
// 二进制否运算符
~~1.2 //1
// 异或运算符
1.2 ^ 0 //1
// 左移运算符
1.2 >> 0 //1
// 右移运算符
1.2 << 0 //1
其他小技巧
- 不借助中间变量交换两变量值
var a = 1;
var b = 2;
a ^= b, b ^= a, a ^= b;
a // 2
b // 1
- 右移运算符可以模拟整除2的运算
12.1212 >> 1 //6
-12.1212 >> 1 //-6