在ECMAScript中,有少数的几个操作符可以对二进制位进行直接操作,这几个操作符本身直接对二进制进行操作,所有它们的本身是非常效率的,学习这一段有助于以后的优化以及理解。 ECMAScript中采用IEEE-754 64位格式存储,但是在开发的过程中不是直接操作的64位,而是后台会先将64位的数据转换位32位,然后让开发者进行操作,最后再填充成64位存储。但是在转换的过程中也会有一个副效应,那就是在对NaN和Infinity的时候,这两个值会被当成0进行处理。对于非数值使用位操作符,会先使用Number()转型函数进行转换为一个数值。 要了解位操作符,首先得来属性一点底层的知识,在计算机中数值分有符号数(如:+40和-40)和无符号数(如:40),这两种数值在二进制里是用不同的表示。

无符号数

无符号数比较好理解,具体怎么转换的就不多过说。如无符号数40,二进制表示为:

         

有符号数

有符号数稍微要难一点,在有符号数里面第32位用于表示负数或者正数(0表示正数,1表示负数),第32位一般称为”符号位”。有符号数中正数的表示方法和无符号数都表示一样。如有符号数+40,二进制表示为:

         

如何表示一个有符号数的负数,这个负数的绝对值取反加1,这个过程加做补码,补码就是为了解决负数在二进制中的表示。如有符号数-40,二进制计算过程为:

         +
 ———————————————-
         -

按位非(NOT)

按位非由一个波浪线(~)表示,按位非的操作是将给定的数值按位取反,如:

 var test = 40;

  二进制为:
 0000 0000 0000 0000 0000 0000 0010 1000

 test = ~test;

 二进制为:
 1111 1111 1111 1111 1111 1111 1101 0111

按位与(AND)

按位与由一个和符号表示(&),按位与有两个操作数,分别对两个操作数进行按位对比,如果对应的位上都为1则当前位返回1,如果对应的位上有一个为0则返回当前位0,如:

 var test1 = 40;

  二进制为:
 0000 0000 0000 0000 0000 0000 0010 1000 

 var test2 = 50;

 二进制为:
 0000 0000 0000 0000 0000 0000 0011 0010 

 var test3 = test1 & test2; 

 二进制为:
 0000 0000 0000 0000 0000 0000 0010 0000

按位或(OR)

按位或由一个竖线符号(|)表示,按位或有两个操作数,分别对两个操作数进行按位对比,对应的位上只要有一个为1则返回当前位1,如果都为0则返回当前位为0。如:

 var test1 = 40; 

 二进制为:
 0000 0000 0000 0000 0000 0000 0010 1000 

 var test2 = 50; 

 二进制为:
 0000 0000 0000 0000 0000 0000 0011 0010 

 var test3 = test1 | test2;

 二进制为:
 0000 0000 0000 0000 0000 0000 0011 1010 

按位异或(XOR)

按位异或由一个插入符号(^)表示,按位异或有两个操作数,分别对两个操作数进行按位对比,对应的位上只要有一个1则返回当前位1,如果都是1或者都是0则返回当前位0

 var test1 = 40; 

 二进制为:
 0000 0000 0000 0000 0000 0000 0010 1000

 var test2 = 50; 

 二进制为:
 0000 0000 0000 0000 0000 0000 0011 0010 

 var test3 = test1 | test2; 

 二进制为:
 0000 0000 0000 0000 0000 0000 0001 1010

左移(<<)

左移操作符由两个小于号表示(<<),左移操作符用于将当前数值从第0位开始按位向左移。如:

 var test = 2; 

 二进制为:10 

 var newTest = 2 << 5;

 二进制为:
 1000000

有符号数右移(>>)

有符号数右移由两个大于符号(>>)组成,有符号数由于第32位是符号位,所以不会移动符号位,所以从第31位右移,但是右移过程中产生的空位用符号位的值来填充。如下例用8位来示范:

 var test = -2; 

 二进制为:
 1000 0010 

 var newTest = 2 >> 5;
 二进制为:
 11111100

无符号数右移(>>>)

无符号数右移由三个大于符号组成(>>>),无符号数第32位不属于符号位,所以右移的时候是从第32位开始移动。如下例用8位来示范:

 var test = 2; 

 二进制为:
 0000 0010 

 var newTest = 2 >>> 5; 

 二进制为:
 0000 0000

ECMAScript位操作符的更多相关文章

  1. 浅谈JavaScript位操作符

    因为ECMAscript中所有数值都是以IEEE-75464格式存储,所以才会诞生了位操作符的概念. 位操作符作用于最基本的层次上,因为数值按位存储,所以位操作符的作用也就是操作数值的位.不过位操作符 ...

  2. 为什么不要在 JavaScript 中使用位操作符?

    如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,F ...

  3. C++位操作符总结

    #include <stdio.h> #include <memory.h> #include <malloc.h> #define MaxBinLength 16 ...

  4. C#位操作符

    位操作符是对数据按二进制位进行运算的操作符.c#位操作符包括: 按位与 & 按位或 | 按位取反 ~ 左移 << 右移 >> 例如:   6:00000110 3:00 ...

  5. Java的按位操作符

    本文参考:Java的位操作符 Java的位操作符用来操作整数基本数据类型中的单个"比特"(bit),即代进制位.而我们知道比特就是0和1,那么,位操作就是对这些数据进行基本的操作. ...

  6. 【关于Java移位操作符&按位操作符】

    一.java按位运算符(操作符) 这段时间偶尔看一下源码,会发现有很多很基础的java知识在脑海中已经慢慢的淡成不常用记忆,于是打算捡起来一些. 按位运算符是来操作整数基本数据类型中的单个“比特”(b ...

  7. 原码、反码、补码及位操作符,C语言位操作

    计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...

  8. C++学习之【使用位操作符求素数分析】

    先放普通代码: #include <iostream> using namespace std; void getPrime_1() { const int MAXN = 100; boo ...

  9. 按位操作符(Bitwise operators)

    按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...

随机推荐

  1. PC-飞起来!我的Windows XP——五步快速优化Windows XP

    虽然Microsoft的 Vista已经发售了快一年,但国内大部分系统用户仍使用着目前堪称完美的Windows XP.与以往的Windows操作系统一样,新安装的Windows XP可能还不在最佳状态 ...

  2. boost------function的使用(Boost程序库完全开发指南)读书笔记

    function是一个函数对象的“容器”,概念上像是c/c++中函数指针类型的泛化,是一种“智能函数指针”.它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象. 因此, ...

  3. windows 下安装elasticsearch

    1.下载 elasticsearch-2.3.3.zip 注意::elasticsearch 版本太高的话,java运行不起来 elasticsearch-1.5.2下载地址 http://downl ...

  4. android 开源项目学习<二>

    roottools:   RootTools gives Rooted developers easy access to common rooted tools...  https://code.g ...

  5. js split str.split(&quot; &quot;); split使用方法 在某处截字符串

    <script language="javascript">    str="2,2,3,5,6,6"; //这是一字符串var strs= new ...

  6. creating normals from alpha/heightmap inside a shader

    http://www.polycount.com/forum/showthread.php?t=117185 I am making some custom terrain shaders with ...

  7. Android开源git40个App源码

    http://www.itbbu.com/1039.html (JamsMusicPlayer)很棒的音乐播放器(new)   (F8)日程安排的软件   (Conversations)基于XMPP的 ...

  8. 知识点整理之Java的Cookie操作

    创建Cookie // new一个Cookie对象,键值对为参数 Cookie cookie = new Cookie("key", "value"); //  ...

  9. 赵雅智:js知识点汇总

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhemhpMjEyOQ==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  10. 从源码角度深入分析log4j配置文件使用

    log4j在日常开发中经常使用,但有时候对 配置文件应该放到什么位置有疑惑.现在我们通过从代码的角度来看待这个问题, 看完后你也许会恍然大悟哦. 开始吧. Log4j的组成及架构: Log4j由三个重 ...