⼆进制位运算符
概述
⼆进制位运算符⽤于直接对⼆进制位进⾏计算,⼀共7个。
⼆进制或运算符(or):符号为|,表⽰若两个⼆进制位都为0,则结果为0,否则为1。
⼆进制与运算符(and):符号为&,表⽰若两个⼆进制位都为1,则结果为1,否则为0。
⼆进制否运算符(not):符号为~,表⽰对⼀个⼆进制位取反。
异或运算符(xor):符号为^,表⽰若两个⼆进制位不相同,则结果为1,否则为0。
左移运算符(left shift):符号为<<。
右移运算符(left shift):符号为>>。
带符号位的右移运算符(zero filled right shift):符号为>>>。
字符串截取后面三位这些为运算符直接处理每⼀个⽐特位,所以是⾮常底层的运算,好处是速度急快,缺点是很不直观。
有⼀点需要注意,**位运算符只对整数起作⽤,如果⼀个运算⼦不是整数,会⾃动转为整数后再执⾏。另外,虽然在JavaScript内部,数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进⾏运算的,并且返回值也是⼀个32位带符号的整数。
i = i | 0;
上⾯这⾏代码的意思就是将i(不管是整数或⼩数)转为32位整数。利⽤这⼀特性,可以写⼀个函数,将任意数值转为32位整数。
function toInt32(x) {
return x | 0;
}
toInt32(1.001) // 1
toInt32(1.999) // 1
toInt32(1) // 1
toInt32(-1) // -1
toInt32(Math.pow(2, 32) + 1) // 1
toInt32(Math.pow(2, 32) - 1) // -1
上⾯代码中,toInt32可以将⼩数转为整数。对于⼀般的整数,返回值不会有任何改变。对于⼤于或等于2的32次⽅的整数,⼤于32位的数位都会被舍去。
⼆进制或运算符
如上。
⼆进制与运算符
⼆进制与运算符(&)的规则是逐位⽐较两个运算⼦,两个⼆进制位之中只要有⼀个位为0,就返回0,否则返回1。
⼆进制否运算符
⼆进制否运算符(~)将每个⼆进制位都变为相反值。
~ 3 // -4
上⾯表达式对3进⾏⼆进制否运算,得到-4。之所以会得到这样的结果,是因为运算时,JavaScript内部将所有的运算⼦都转为32位的⼆进制整数再进⾏运算。
3的32位整数形式是00000000000000000000000000000011,⼆进制否运算之后得到的是11111111111111111111111111111100。由于第⼀位是1,所以这个数是⼀个负数。JavaScript内部采⽤补码形式表⽰负数,即需要将这个数减去1再取反,然后加上负号,才能得到这个负数对应的10进制值。这个数减1之后得到11111111111111111111111111111011,再取反得
到00000000000000000000000000000100,再加上负号就是-4。考虑到这样的过程⽐较⿇烦,可以简单记忆成,⼀个数与⾃⾝取反值相加等于-1。
对于⼀个整数,连续两次⼆进制否运算,得到它⾃⾝。
⼆进制否运算遇到⼩数时,也会将⼩数部分舍去,只保留整数部分。所以,对⼀个⼩数连续两次进⾏⼆进制否运算,能达到取整的效果。使⽤⼆进制否运算取整,是所有取整⽅法中最快的⼀种。
~~2.9 // 2
对字符串进⾏⼆进制否运算,JavaScript引擎会先调⽤Number函数,将字符串转为数值。
对于其他类型的值,⼆进制否运算也是先⽤Number转为数值,然后再进⾏处理。
异或运算符
异或运算有⼀个特殊运⽤,连续对两个数进⾏三次异或运算,可以互换它们的值。这是互换两个变量的值的最快的⽅法。
var a = 10;
var b = 99;
a ^= b,
b ^= a, a ^= b;
a // 99
b // 10
异或运算也可以⽤来取整。
左移运算符
左移运算符(<<)表⽰将⼀个数的⼆进制值向左移动指定的位数,尾部补0,即乘以2指定的次⽅。如果左移0位,就相当于将该数值转为32位整数,等同于取整,对于正数和负数都有效。
例如:
var color = {r: 186, g: 218, b: 85};
// RGB to HEX
// (1 << 24)的作⽤为保证结果是6位整数
var rgb2Hex = function(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b)
.toString(16) // 先转成⼗六进制,然后返回字符串
.substr(1); // 去除字符串的最⾼位,返回后⾯六个字符
}
右移运算符
右移运算符(>>)表⽰将⼀个⼆进制向右移动指定的位数,头部补0,即除2的指定次⽅,最⾼位符号位不参与移动。
带符号位的右移运算符
带符号位的右移运算符(>>>)表⽰将⼀个数的⼆进制形式向右移动,包括符号位也参与移动,头部补0。所以该运算总是得到正值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论