JS的位运算符

重温整数

ECMAScript整数有两种类型,有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在ECMAScript中,所有整数字面量默认都是有符号整数。

有符号整数,数值范围从-2147483648到2147483647;无符号整数,数值范围从0到4294967295。记住,所有整数字面量都默认存储为有符号整数,只有ECMAScript的位运算符才能创建无符号整数。

把无符号整数转换为字符串,只返回有效位。也就是前面都是0的就不返回了。

var i = 18, j = -18;
alert(i.toString(2)); // -> ‘10010‘
alert(j.toString(2)); // -> ‘-10010‘

虽然负数的二进制显示是在正数的二进制表示前加负号,但负数存储也是二进制代码,采用的形式是二进制补码。

计算二进制补码步骤有3步:

  1. 确定数字的非负版本的二进制表示。如,-18的补码要先确定18的二进制表示
  2. 求得二进制反码,即把0替换为1,把1替换为0
  3. 在二进制反码上加1

位运算符NOT(~)

位运算符由否定好(~)表示,它是ECMAScript中为数不多的与二进制算术有关的运算符之一。位运算符NOT是三步的处理过程:

  1. 把运算数转为32位二进制数字
  2. 再转为它的二进制反码
  3. 把二进制反码转为浮点数

感觉很麻烦,而上述操作简单来说,可以相当于对数字求负,然后减1,比如~25 === -26

位运算符AND(&)

它对数字的二进制进行操作,把数字转换为二进制后,把每个数字中的数位对齐,然后以下面规则进行AND运算:

1 对 1 -> 1
1 对 0 -> 0
0 对 1 -> 0
0 对 0 -> 0

因此,25 & 3 = 1

位运算符OR(|)

同理AND运算符,只不过它的规则是:

1 对 1 -> 1
1 对 0 -> 1
0 对 1 -> 1
0 对 0 -> 0

因此, 25 | 3 = 27

位运算符XOR(^)

同上理,只不过它的规则是:

1 对 1 -> 0
1 对 0 -> 1
0 对 1 -> 1
0 对 0 -> 0

因此, 25 ^ 3 = 26

左移运算(«)

移位运算一般在开发中用不到,都是用于极度优化的代码中如驱动程序。左移运算把数字的所有数位向左移动指定的数量。在左移数位时,数字右边多出的空位会被0填充,使结果为完整的32位数字。注:左移操作保留数字的符号位。“符号仍然存储在第32位中吗?”是的。

有符号右移运算(»)

它把32位数字中的所有数位整体右移,同时保留该数的符号。移位后会造成空位,这时空位位于数字的左侧,位于符号为的右侧,ECMAScript用符号位来填充空位,创建完整的数字。

无符号右移运算(»>)

它把32位数字中的所有数位整体右移。对于正数,它与有符号右移运算是一样的。对于负数,情况就不同了。无符号右移用0填充所有空位。对于正数,这与有符号右移运算的操作完全一样,而负数则被作为正数来处理。由于无符号右移运算的结果是一个32位的正数,所以负数的无符号右移运算得到的是一个非常大的数字。要实现这点,需要把数字转为无符号的等价形式(尽管这个数字还是有符号的),可以这样来转换:

var iUnsigned64 = -64 >>> 0;

然后用Number类型的toString()获取它真正的位表示,采用的基为2:

alert(iUnsigned64.toString(2));

结果生成 11111111111111111111111111000000,即有符号的-64的二进制补码表示,不过它等于无符号整数4294967232。出于这种原因,使用无符号右移运算符时要小心。

JS的位运算符

时间: 2024-10-14 17:03:38

JS的位运算符的相关文章

JS中的逻辑运算符&&、||,位运算符|,&

1.JS中的||符号: 运算方法: 只要"||"前面为false,不管"||"后面是true还是false,都返回"||"后面的值. 只要"||"前面为true,不管"||"后面是true还是false,都返回"||"前面的值. 总结:真前假后 2.JS中的&&符号: 运算方法: 只要"&&"前面是false,无论"&

【js】逻辑运算符 && 、|| ,位运算符 | 、&

1.JS中的||符号: 运算方法: 只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值. 只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值. 总结:真前假后 2.JS中的&&符号: 运算方法: 只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值; 只要“&&”前面是true,无论“&&

精讲JS逻辑运算符&&、||,位运算符|,&

1.JS中的||符号: 运算方法: 只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值. 只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值. 总结:真前假后 2.JS中的&&符号: 运算方法: 只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值; 只要“&&”前面是true,无论“&&

js 位运算符 以及 心算十进制二进制相互转换

位运算符 |(或) 运算 有1即为1,双0才为0 1 31| 2 = 11111 | 10 = 11111 = 3 2 3 | 4 = 11 | 100 = 111 = 7 3 6 | 7 = 110 | 111 = 111 = 7 4 10 | 9 = 1010 | 1001 = 1011 = 11 &(与) 运算 有0即为0,双1才为1 1 31 & 2 = 11111 & 10 = 00010 = 2 2 3 & 4 = 11 & 100 = 000 = 0

js之运算符(位运算符)

一.概念 位运算在数字底层(表示数字的32个数位)进行运算的.由于位运算是低级的运算操作,所以速度往往也是最快的,但是它很不直观,许多场合不能够使用.大多数语言都提供了按位运算符,恰当的使用按位运算符有时候会取得很好的效果. 位运算只对整数起作用,如果一个运算不是整数,会自动转为整数后再运行.虽然在Javascript内部,数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数. 这种位转换使得在对特殊的NaN和infinit

JS中的运算符&JS中的分支结构

一.JS中的运算符 1.算术运算(单目运算符) + 加.- 减.* 乘./ 除.% 取余.++ 自增.-- 自减 >>> +:有两种作用,连接字符串/加法运算.当+两边全为数字时,进行加法运算: 当+两边有任意一边为字符串时,起连接字符串的作用,连接之后的结果为字符串 除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字 >>> /: 结果会保留小数点 >>> ++: 自增运算符,将变量在原有基础上+1: --: 自减运算符,将变量在原

类型转换、运算符、位运算符【以及原码、反码、补码】

1.类型转换 php中的‘+’与js有区别,php中+只是算术运算符[更偏向转化为数字].js更偏向转化为字符串 php本身的自动转换类型便符合大多数对类型的处理.[也有强制转换的情形出现] [注意转换关系:字符串转换成数字类型,开头的那部分字符串能够转化为数字(还要判断浮点型和整型)] 2.转换成布尔型[实现流程控制的关键] 以下值为false: (1)布尔值为false (2)整型值为0 (3)浮点型为0.0 (4)空字符串[字符串'0'(相当于是字符串做数组时是一个空字符串),区别,注意‘

JS中的运算符和JS中的分支结构

JS中的运算符 1.算术运算(单目运算符) + .-.*. /. %取余.++自增 .--自减 +:两种作用,链接字符串/加法运算.当+两边全为数字时,进行加法运算:当+两边有任意一边为字符串时,起链接字符串作用, 链接之后的结果为字符串. 除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字: /:结果会保留小数点. ++:自增运算符,将变量在原有基础上+1: --:自增运算符,将变量在原有基础上-1: [a++和++a的异同] ①相同点:无论a++还是++a,运算完以后,a的

js中位运算的运用

原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更高的.下面通过一些实例来加深对位运算的理解. 按位与(&) &&运算符我们都知道,只有两个都为真,结果才为真.&道理是一样的,只有两个数的值为1时,才返回1.例如1和3的按位与操作: 0001 & 0011 --------- 0001 只有对应的数为1时,结果才为1,