ECMAScript位运算符
来源:互联网 发布:如何成为金融数据分析 编辑:程序博客网 时间:2024/06/01 08:31
学习到了ECMAScript位运算符,但是只能出结果,却不知道原理是什么。
位运算符有七种,分别是:位非NOT(~)、位与AND(&)、位或OR(|)、位异或XOR(^)、左移(<<)、有符号右移(>>)、无符号右移(>>>)。
var box=~25 //-26
var box=25&3; //1
var box=25|3; //27
var box=25^3; //26
var box=2<<5; //64
var box=64>>5; //2
var box=64>>>5; //2
以上便是描述的情况。我们一起来学习一下它的原理。
位非NOT(~)
位非NOT是三步的处理过程:
1、把运算符转换成32位数字
2、把二进制数转换成它的二进制反码
3、把二进制数转换成浮点数
分析上例:var box=~25 //-26
<span style="font-size:14px;">var box1=25; //25 等于 0000 0000 0000 0000 0000 0000 0001 1001var box2=-box1; //转换为 1111 1111 1111 1111 1111 1111 1110 0110alert(box2); //输出 "-26"</span>位运算符NOT实际上是对数字求负,然后减1,因此25变-26。用下面的方法也可以得到同样的结果。
var box1=25; var box2=-box1-1; alert(box2); //输出 -26
位与AND(&)
位与AND直接对数字的二进制形式进行运算。它把每个数字中的数位对齐,当只有两个数位存放的是1时,它才返回1。
分析上例:var box=25&3; //1
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
------------------------------------------------------------------------
AND=0000 0000 0000 0000 0000 0000 0000 0001
可以看出,在25和3中,只有1个数位(位0)存放的都是1,因此,其他数位生成的都是0,所以结果为1。
位或OR(|)
位或OR与上一个不同的是当有任意一个数位存放的是1时,它就返回1。
分析上例:var box=25|3; //27
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
------------------------------------------------------------------
OR=0000 0000 0000 0000 0000 0000 0001 1011
可以看出,在两个数字中,共有4个数位存放的是1,这些数位被传递给结果。二进制代码11011等于27。
位异或XOR(^)
位异或XOR与上一个不同的是当只有一个数位存放的是1时,它才返回1。
分析上例:var box=25^3; //26
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
------------------------------------------------------------------
OR=0000 0000 0000 0000 0000 0000 0001 1010
可以看出,在两个数字中,共有4个数位存放的是1,这些数位被传递给结果。二进制代码11011等于26.左移(<<)
左移把数字中的所有数位向左移动指定的数量。
分析上例:var box=2<<5; //64
注意:在左移数位时,数字右边多出3个空位。左移运算用0填充这些空位,使结果成为完整的32位数字。
注意:(在ECMAScript中,所有整数字面量默认都是有符号整数,有符号整数使用31位表示整数的数值,用第32位表示整数的符号,0表示正数,1表示负数。)左移运算保留数字的符号位。例如,如果把-2左移5位,而不是64。符号仍然存储在32位中,不过这在ECMAScript后台进行,开发者不能直接访问第32个数位。即使输出二进制字符形式的负数,显示的也是负号形式。
有符号右移(>>)
有符号右移把32位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)。有符号右移运算符恰好与左移运算符相反。但要注意,移动数位后造成的空位要用符号位的值填充,创建完整的数字。
无符号右移(>>>)
(无符号整数只允许用正数,把最后一位作为另一个数位处理)无符号右移将无符号32位数的所有数位整体右移。对于正数,无符号右移运算的结果与有符号右移运算一样。对于负数,无符号右移运算用0填充所有空位。】
小结:
位运算符只是ECMAScript运算符中的一种,它比较基于底层,性能和速度非常好,但也正因为比较底层,使用的难度也很大。在一般的应用中,我们基本上用不到位运算符。不讲究是发现的原动力,发现问题去探究还是收获很大的。
- ECMAScript 位运算符
- ECMAScript位运算符
- ECMAScript 位运算符
- ECMAScript 一元运算符
- ECMAScript Boolean 运算符
- ECMAScript 关系运算符
- ECMAScript 条件运算符
- ECMAScript 赋值运算符
- ECMAScript 逗号运算符
- ECMAScript 一元运算符
- ECMAScript运算符_一元运算符&位运算符&逻辑运算符&乘性运算符&加性运算符
- ECMAScript基础(运算符)
- ECMAScript中的typeof运算符
- ECMAScript 乘性运算符
- ECMAScript 加性运算符
- ECMAScript 等性运算符
- ECMAScript 6:展开运算符 ...
- ES6(ECMAScript 6 ) 解构 扩展运算符
- 目标跟踪之mean shift
- doc 命令下远程链接mysql
- BInsertSort
- 解决Tomcat中设置默认项目时只能访问静态页面的问题
- Openwrt 学习记录:openWRT添加用户模块-helloword(四)
- ECMAScript位运算符
- hdu 1081 To The Max(最大子矩阵和,dp)
- sqlserver 消息 682,: 内部错误。提供用于读取列值的缓冲区太小。请运行 DBCC CHECKDB 查看是否有损坏情况 的处理方法
- 理解 Javascript 的闭包
- IO-00~~~IO-04
- 独处效率感想
- wireshark插件开发详细流程(含源码)
- Linux 日志级别(loglevel)详解
- 学习Javascript闭包(Closure)