首页 > 技术文章 > 重要但是少用的运算符

cloud- 2017-10-19 09:57 原文

先了解

1.原码,反码,补码

正数的反码和补码都与原码相同。
负数的反码为对该数的原码除符号位外各位取反。
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1   

2. 负数在计算机中是怎么存的

首先声明在计算机中负数的存储是采用二进制补码的形式的
以-3为例,32位为基础:
原码:00000000 00000000 00000000 00000011
反码:11111111 11111111 11111111 11111100
补码:11111111 11111111 11111111 11111101

1. 按位与运算符 &

对两个表达式执行按位"与"。
每一个位执行按位“与”运算。 如果两个位均为 1,则结果是 1。 否则,结果为 0。

/ 9 is 00000000000000000000000000001001
var expr1 = 9;
// 5 is 00000000000000000000000000000101
var expr2 = 5;
// 1 is 00000000000000000000000000000001
var result = expr1 & expr2;
document.write(result);
// Output: 1

2.按位或运算符 |

对两个表达式执行按位“或”运算。
任何时候,只要其中任意一个表达式有一位为 1,则结果中的该位即为 1。否则,结果中的该位将为 0。

7|11
// 15
7:   00000111
11:  00001011
7|11:00001111

3.按位异或运算符 ^

对两个表达式执行按位“异或”运算。
当且仅当只有一个表达式的某位为 1 时,结果中的该位才为 1。否则,结果中的该位为 0。

5^12
//9
0101   (expression1)
1100   (expression2)
----
1001   (result)

4.按位取反运算符 ~

所有一元运算符(如 ~ 运算符)都按照下面的规则来计算表达式的值:

  • 如果应用于未定义的表达式或 null 表达式,则会引发一个运行时错误。
  • 将对象转换为字符串。
  • 如果可能,将字符串转换为数字。否则,将引发运行时错误。
  • 布尔值被视为数字(如果为 false,则为 0;如果为 true,则为 1)。


    运算符将应用于结果数字。
    ~ 运算符查看表达式的二进制表示形式的值,并执行位非运算。
    表达式中的任何一位为 1,则结果中的该位变为 0。表达式中的任何一位为 0,则结果中的该位变为 1。
    下面的示例阐释了位非 (~) 运算符的用法。
var temp = ~5;
表达式 二进制值(2 的补数) 十进制值
5 00000000 00000000 00000000 00000101 5
~5 11111111 11111111 11111111 11111010 -6

可以总结为: ~a = -(a+1)

5.按位左移运算符 <<

左移表达式的位。

var temp
temp = 14 << 2
//变量 temp 的值为 56,因为 14(即二进制的 00001110)左移
//两位等于 56(即二进制的 00111000)

6.按位右移运算符 >>

右移表达式的位,保持符号不变。

var temp
temp = -14 >> 2
//temp 的值为 -4:因为 -14(即二进制的 11110010)右移两位后等于 -4(即二进制的 11111100)。

如果有疑问,参考文章开头 负数在计算机中是怎么存的

7.无符号右移位运算符 >>>

变量值右移表达式值指定的位数,但不保持符号,并将结果赋给该变量。

var temp
temp = -14
temp = temp >>> 2

变量 temp 的初始值为 -14(二进制补码为 11111111 11111111 11111111 11110010)。向右移两位后,该值等于 1073741820(二进制为 00111111 11111111 11111111 11111100)。
怎么换算 00111111 11111111 11111111 11111100 为 十进制,parseInt('00111111 11111111 11111111 11111100',2)

8. 逗号运算符 ,

顺序执行两个表达式。
, 运算符会导致按从左到右的顺序执行表达式。 , 运算符的常见用法是在 for 循环的增量表达式中使用。例如:

j=25;
for (i = 0; i < 10; i++, j++)
{
   k = i + j;
}

for 语句只允许在每次通过循环的结尾时执行单个表达式。 , 运算符允许将多个表达式视为单个表达式,因此这两个变量都可以递增。
其实,正常的语句也是可以执行的,比如: console.log(a),alert('1')

9. void 运算符

禁止表达式返回值。
void 运算符计算其表达式,并返回 undefined。 当应计算表达式,但又不希望脚本的其他部分看见其结果时,该运算符很有用。


> [javascript 运算符](https://msdn.microsoft.com/zh-cn/library/ce57k8d5(v=vs.94).aspx)

推荐阅读