ECMAScript运算符之《位运算符》

浏览: 2,331次 日期:2018年06月12日 19:39:16 作者:青格勒

位运算符是在数字底层(即表示数字的 32 个数位)进行操作的。

比如:00000000000000000000000000000010

 

位运算符有一下几个:

1、位运算 NOT(~表示)

2、位运算 AND(&表示)

3、位运算 OR(|表示)

4、位运算 XOR(^表示)

5、左移运算(<<表示)

6、有符号右移运算(>>表示)

7、无符号右移运算(>>>表示)

 

看懂这个之前需要了解的知识点:

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

2、有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围从 -2147483648 到 2147483647

 

看下面的图,一个数字是这样表示的:(更多二进制的知识请自学一下)

 

比如说十进制数字33转换为2进制的时候:

var iNum = 33;
console.log(iNum.toString(2));//输出:100001

33的二进制输出的是:100001

33的完整二进制为:00000000000000000000000000100001

因为33是正数(最后一位为0)所以保存的时候会直接把前面的0忽略打印出:100001

 

那么负数怎么储存?

负数也存储为二进制代码,不过采用的形式是二进制补码。

 

计算数字二进制补码的步骤有三步:

1、确定该数字的非负版本的二进制表示

2、求得二进制反码,即要把 0 替换为 1,把 1 替换为 0

3、在二进制反码上加 1

 

咱们看一下负数的例子:

var num = -33;
console.log(num.toString(2));

-33的二进制打印出来的是:-100001

并不是:11111111111111111111111111011111这个

这样做的目的是为了为避免访问位31(0-31),程序直接在后面给咱们计算了。

具体为如下图:

 

 

下面咱们就一个个来认识一下这些运算符:

 

一、位运算 NOT(~表示)

位运算 NOT 是三步的处理过程:

1.把运算数转换成 32 位数字

2.把二进制数转换成它的二进制反码

3.把二进制数转换成浮点数

 

简单例子:

var num1 = 33;      //33的二进制  -> 00000000000000000000000000100001
var num2 = ~num1;   //-33的二进制 -> 11111111111111111111111111011110 在上面的32位上进行取反
console.log(num2);  //输出 "-34"

按照常理讲的话应该是-33才对,但是咱们得把0作为正数的第一个来算,所以0的负数是-1,以此类推

 

二、位运算 AND(&表示)

位运算 AND 的处理过程:

1、求出两个数字的二进制

2、每个数字中的数位对齐,并对其进行AND运算

3、求真输出

 

AND运算为如下图:

 

来个简单的例子说一下:

var num = 33 & 124;
console.log(num);  //输出32

 

计算的步骤如下:

图片上咱们可以看得到,先取得两个数字的32位二进制码。然后进行了《与》操作,最后得到的是与运算符的结果。

 

 

三、位运算 OR(|表示)

位运算 OR 的处理过程:

1、求出两个数字的二进制

2、每个数字中的数位对齐,并对其进行OR运算

3、求真输出

 

OR运算为如下图:

 

这个也来个例子:

var num = 33 | 124;
console.log(num);  //输出125

计算的步骤如下:

OR运算符是《或运算符》,只要达成一个就计算成《真》。

 

四、位运算 XOR(^表示)

位运算 XOR 的处理过程:

1、求出两个数字的二进制

2、每个数字中的数位对齐,并对其进行XOR运算

3、求真输出

 

XOR运算为如下图:

 

按照惯例来例子说话:

var num = 33 ^ 124;
console.log(num);  //输出93

 

计算的步骤如下:

 

五、左移运算(<<表示)

左移运算保留数字的符号位(也就是第32位),数字中的所有数位向左移动指定的数量

位运算 左移运算 的处理过程:

1、求出数字的二进制

2、对二进制数字进行移位

 

例子又来了:

var num2 = 10;          //二进制:1010
var num = num2 << 3;   //二进制:1010000,十进制为80
console.log(num)        //80
console.log(num2.toString(2)); //00000000000000000000000000001010
console.log(num.toString(2));  //00000000000000000000000001010000

 

计算的步骤如下:

 

 

六、有符号右移运算(>>表示)

有符号右移运算保留数字的符号位(也就是第32位),数字中的所有数位向右移动指定的数量

位运算 有符号右移运算 的处理过程:

1、求出数字的二进制

2、对二进制数字进行移位

 

正数例子:

var num2 = 28;         //二进制:11100
var num = num2 >> 3;   //二进制:11,十进制为3
console.log(num)       //3
console.log(num2.toString(2)); //00000000000000000000000000011100
console.log(num.toString(2));  //00000000000000000000000000000011

计算的步骤如下:

 

负数例子:

var num2 = -28;      //二进制:11100
var num = num2 >> 3;  //二进制:11,十进制为3
console.log(num)      //-4
console.log(num2.toString(2)); //10000000000000000000000000011100
console.log(num.toString(2));  //10000000000000000000000000000100

计算的步骤如下:

 

七、无符号右移运算(>>>表示)

它将无符号 32 位数的所有数位整体右移。对于正数,无符号右移运算的结果与有符号右移运算一样。

负数则被作为正数来处理

位运算 无符号右移运算 的处理过程:

1、求出数字的二进制

2、对二进制数字进行移位

 

正数例子:

var num2 = 28;        //二进制:11100
var num = num2 >>> 3;  //二进制:11,十进制为3
console.log(num)        //3
console.log(num2.toString(2));
console.log(num.toString(2));

计算的步骤如下:

 

负数例子:

var num2 = -28;           //二进制:10000000000000000000000000011100
var num = num2 >>> 3;  //二进制:01111111111111111111111111110010,十进制为2147483634
console.log(num)        //2147483634
console.log(num2.toString(2));//-11100
console.log(num.toString(2));//01111111111111111111111111110010

计算的步骤如下:

 

对于初学者来说,位运算符是比较难理解的,因为他里面计算的方式有很多,所以这次我前前后后研究了两天,也做了很多的例子,把容易理解的部分拿出来跟大家分享一下。

 

文章链接:http://cenggel.com/js/93.html

本文章由:青格勒编辑,转载请带上文章链接。w

借鉴网址:【http://www.w3school.com.cn】

点击任意位置关闭窗口,感谢您的支持。


打赏规则 - 为了避免对于打赏模式产生误解,说明一下几点内容:

  • 1.打赏纯粹自愿,金额不限,别太多,1块就行;
  • 2.打赏不能作为解答疑问的理由;
  • 3.打赏不能帮你做毕业设计或论文;
  • 4.打赏不能帮你做工作中的项目;
  • 5.打赏就是这不能那不能,只是单纯打赏而已。
  • 5.最后谢谢支持。
关闭
相关文章

发表评论

邮箱地址不会被公开。 必填项已用*标注