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,任何一位是 0,结果都是 0。
下面看一个对 25 和 3 执行按位与操作的例子:
var result = 25 & 3;
alert(result); //1
可见,对 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
42 第 3 章 基本概念
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
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)。
5. 左移
左移操作符由两个小于号( <<)表示,这个操作符会将数值的所有位向左移动指定的位数。例如,
如果将数值 2(二进制码为 10)向左移动 5 位,结果就是 64(二进制码为 1000000),代码如下所示:
var oldValue = 2; // 等于二进制的 10
var newValue = oldValue << 5; // 等于二进制的 1000000,十进制的 64
注意,在向左移位后,原数值的右侧多出了 5 个空位。左移操作会以 0 来填充这些空位,以便得到
的结果是一个完整的 32 位二进制数
注意,左移不会影响操作数的符号位。换句话说,如果将2 向左移动 5 位,结果将是64,而非 64。
6. 有符号的右移
有符号的右移操作符由两个大于号( >>)表示,这个操作符会将数值向右移动,但保留符号位(即
正负号标记)。有符号的右移操作与左移操作恰好相反,即如果将 64 向右移动 5 位,结果将变回 2:
var oldValue = 64; // 等于二进制的 1000000
var newValue = oldValue >> 5; // 等于二进制的 10 ,即十进制的 2
同样,在移位过程中,原数值中也会出现空位。只不过这次的空位出现在原数值的左侧、符号位的
右侧(见图 3-3)。而此时 ECMAScript 会用符号位的值来填充所有空位,以便得到一个完整的值。
本文出自 “9196441” 博客,请务必保留此出处http://9206441.blog.51cto.com/9196441/1698144
原文:http://9206441.blog.51cto.com/9196441/1698144