JS中位运算符

js 中位运算

num & 1  用来判断 num奇偶

就是把num与1做与运算
举例:num=3的话
3与1的与运算就是(先写成2进制,然后同位比较,都为1时此位为1,否则为0):
11 & 01 = 01
因此 3与1的与运算就是1
 

+num

将num转化位Number类型,等价值调用Number(num)

 

一元加和减操作符


绝大多数开发人员对一元加和减操作符都不会陌生,而且这两个ECMAScript 操作符的作用与数学
书上讲的完全一样。一元加操作符以一个加号(+)表示,放在数值前面,对数值不会产生任何影响,
如下面的例子所示:
var num = 25;
num = +num; // 仍然是25
不过,在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。
换句话说,布尔值false 和true 将被转换为0 和1,字符串值会被按照一组特殊的规则进行解析,而
对象是先调用它们的valueOf()和(或)toString()方法,再转换得到的值。
下面的例子展示了对不同数据类型应用一元加操作符的结果:

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1 = +s1; // 值变成数值1
s2 = +s2; // 值变成数值1.1
s3 = +s3; // 值变成NaN
b = +b; // 值变成数值0
f = +f; // 值未变,仍然是1.1
o = +o; // 值变成数值-1


一元减操作符主要用于表示负数,例如将1 转换成1。下面的例子演示了这个简单的转换过程:
var num = 25;
num = -num; // 变成了-25

 

在将一元减操作符应用于数值时,该值会变成负数(如上面的例子所示)。而当应用于非数值时,
一元减操作符遵循与一元加操作符相同的规则,最后再将得到的数值转换为负数,如下面的例子所示:

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1 = -s1; // 值变成了数值-1
s2 = -s2; // 值变成了数值-1.1
s3 = -s3; // 值变成了NaN
b = -b; // 值变成了数值0
f = -f; // 变成了-1.1
o = -o; // 值变成了数值1


一元加和减操作符主要用于基本的算术运算,也可以像前面示例所展示的一样用于转换数据类型。

 

位操作符

位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。ECMAScript 中的所有数
值都以IEEE-754 64 位格式存储,但位操作符并不直接操作64 位的值。而是先将64 位的值转换成32 位
的整数,然后执行操作,最后再将结果转换回64 位。对于开发人员来说,由于64 位存储格式是透明的,
因此整个过程就像是只存在32 位的整数一样。
对于有符号的整数,32 位中的前31 位用于表示整数的值。第32 位用于表示数值的符号:0 表示正
数,1 表示负数。这个表示符号的位叫做符号位,符号位的值决定了其他位数值的格式。其中,正数以
纯二进制格式存储,31 位中的每一位都表示2 的幂。第一位(叫做位0)表示20,第二位表示21,以此
类推。没有用到的位以0 填充, 即忽略不计。例如, 数值18 的二进制表示是
00000000000000000000000000010010,或者更简洁的10010。这是5 个有效位,这5 位本身就决定了实
际的值。

负数同样以二进制码存储,但使用的格式是二进制补码。计算一个数值的二进制补码,需要经过3 个步骤;

。。。

1. 按位非(NOT)
按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。按位非是
ECMAScript 操作符中少数几个与二进制计算有关的操作符之一。下面看一个例子:
var num1 = 25; // 二进制00000000000000000000000000011001
var num2 = ~num1; // 二进制11111111111111111111111111100110
alert(num2); // -26

这里,对25 执行按位非操作,结果得到了26。这也验证了按位非操作的本质:操作数的负值减1。
因此,下面的代码也能得到相同的结果:
var num1 = 25;
var num2 = -num1 - 1;
alert(num2); // "-26"
虽然以上代码也能返回同样的结果,但由于按位非是在数值表示的最底层执行操作,因此速度更快。


2. 按位与(AND)
按位与操作符由一个和号字符(&)表示,它有两个操作符数。从本质上讲,按位与操作就是将两
个数值的每一位对齐,然后根据下表中的规则,对相同位置上的两个数执行AND 操作:
第一个数值的位 第二个数值的位 结 果
1 1 1
1 0 0
0 1 0
0 0 0
简而言之,按位与操作只在两个数值的对应位都是1 时才返回1,任何一位是0,结果都是0。
下面看一个对25 和3 执行按位与操作的例子:
var result = 25 & 3;
alert(result); //1
BitwiseAndExample01.htm
可见,对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。


3. 按位或(OR)
按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。按位或操作遵循下面这个真值表。
第一个数值的位 第二个数值的位 结 果
1 1 1
1 0 1
0 1 1
0 0 0
由此可见,按位或操作在有一个位是1 的情况下就返回1,而只有在两个位都是0 的情况下才返回0。
如果在前面按位与的例子中对25 和3 执行按位或操作,则代码如下所示:
var result = 25 | 3;
alert(result); //27

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,因此可以把每个1 直接放到结果中。二进制码11011 等于十进制值27。


4. 按位异或(XOR)
按位异或操作符由一个插入符号(^)表示,也有两个操作数。以下是按位异或的真值表。
第一个数值的位 第二个数值的位 结 果
1 1 0
1 0 1
0 1 1
0 0 0
按位异或与按位或的不同之处在于,这个操作在两个数值对应位上只有一个1 时才返回1,如果对
应的两位都是1 或都是0,则返回0。
对25 和3 执行按位异或操作的代码如下所示:
var result = 25 ^ 3;
alert(result); //26
BitwiseXorExample01.htm
25 与3 按位异或的结果是26,其底层操作如下所示:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
这两个数值都包含4 个1,但第一位上则都是1,因此结果的第一位变成了0。而其他位上的1 在另
一个数值中都没有对应的1,可以直接放到结果中。二进制码11010 等于十进制值26(注意这个结果比
执行按位或时小1)。

 

摘自Javascript高级程序设计3.5

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值