javascript的二进制运算符用于直接对二进制位进行计算,好处是速度快,缺点是不直观.

位运算符只对整数起作用,如果一个运算子不是整数,则会转换成整数后再执行;我们都知道javascript的数值都是以64位浮点数的形式储存的,但是在做位运算的时候,是以32位带符号的整数进行运算的,并且返回的也是32位带符号的整数

位运算符主要包括:

  • 二进制或运算符(|): 如果两个符号位都为0,则结果为0,否则为1.

    1100 | 0101 返回 1101

  • 二进制与运算符(&): 如果两个符号位都为1,则结果为1,否则为0

    1100 & 0101 返回 0100

  • 二进制非运算符(~): (一元运算符)取反,二进制位0变1,1变0

    ~1100 返回 0011

  • 二进制异或运算符(^): 若两个二进制位相同,则结果为0;否则为1

    1100 ^ 0101 返回 1001

  • 二进制左位移运算符(<<): 相当于乘以2的几次方

    5(十进制) << 3 相当于 5*(2的三次方)

  • 二进制右位移运算符(>>): 相当于除以2的几次方

    5(十进制) >> 3 相当于 5/(2的三次方)

  • 二进制无符号右位移(>>>): 也叫作头部补零右位移运算符
// 声明变量a并赋值为1
var a = 1;
// 利用位运算符返回的是32位带符号的整数可以将a转换为32位的整数
a = a | 0; // 利用这个特性,可以写出一个将任意值转为32位整数的函数
function toInt32(x) {
return x | 0;
}

二进制或运算符(or)(符号|)

逐位比较两个运算子的二进制位,只要有一个是1的就返回1,否则返回0

需要注意的是位运算只对整数有效,如果是小数,则会吧小数部分舍去,只保留整数部分,然后再进行位运算

// 返回-2
-2.9 | 0

二进制与运算符(and)(符号&)

逐位比较两个运算子的二进制位,只要有一个是0就返回0,否则返回1

// 变为二进制 00 & 11
// 结果为00,返回0
0 & 3

二进制否运算符(not)(符号!)

二进制否运算符将每个二进制位都变为相反值(1变为0,0变为1)

// 5的32位整数二进制形式为00000000000000000000000000000101,
// 否运算后11111111111111111111111111111010,
// 最高位是1表示负数,计算机内部的负数是以补码的形式来储存的,
// 所以需要减一取反来计算出源码00000000000000000000000000000110,十进制形式为6,再加上符号为-6
~5 = -6
  1. 可以简单记成一个数与自身的取反值相加,等于-1
  2. 对一个整数连续两次二进制否运算,得到它自身
  3. 所有的位运算都只对整数有效,二进制否运算符遇到小数时也会舍去小数部分,所以我4. 们可以利用这个特性对一个小数连续进行两次二进制否运算,能达到取整的效果
  4. 对字符串进行二进制否运算,javascript会先调用Number函数将字符串转为数值

二进制异或运算符(xor)(符号 ^)

两个二进制位相同为0,不同为1

异或运算符的运用: 在不使用第三变量的情况下交换两个变量的值

// a的32位整数二进制表示 00000000000000000000000000001010
// b的32位整数二进制表示 00000000000000000000000000001011
var a = 10;
var b = 11;
// a ^ b 为 00000000000000000000000000000001
a = a ^ b;
// 此时变为 00000000000000000000000000000001 ^ 00000000000000000000000000001011
b = b ^ a;
a = a ^ b;

二进制左位移运算符(Left Shift)(符号<<)

左位移运算符表示将一个数的二进制位值向左移动制定的位数,尾部补0,即乘以2的指定次方.向左移动时,最高位的符号位也是一起移动的

如果左移0位,就相当于将该数值转为32位整数,等同于取整,对正负数都有效

var color = {r: 100,g: 120,b: 66};
// RGB转为HEX
// 1 << 24是为了保证结果是6位数
// HEX最多是#加6为数字(16进制),所以最小是000000,最大是ffffff
var rgbToHEX = function(r,g,b){
return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).substr(1);
}
// #647842
rgbToHEX(color.r,color.g,color.b);

补充javascript中的toString()

Array.toString(): 数组的toString()是将数组转换为一个字符串,并返回

Boolean.toString(): 将boolean转换为字符串,值是"true"或"false"

Date.toString(): 将日期对象转换为字符串形式,采用本地时间

Error.toString(): 将错误转换为字符串

Function.toString(): 将函数转换为字符串

Number.toString(): 将数字转换为字符串,可以传入指定的参数,参数表示为是指定进制(范围是2-36)。例如当参数是2时,返回二进制数

二进制右位移运算符(Right Shift)(符号>>)

右位移运算符(>>)b表示将一个数的二进制形式向右移动指定的位数,如果这个数是整数,头部补0;如果是负数,头部补1.(最高位符号位也会跟着移动)

右移运算符相当于除以2的指定次方

头部补零的右位移运算符

头部补零的右位移运算符(>>>)与右位移运算符相似,正数时完全一样,负数时,头部一律补0,而不考虑符号位.所以该运算符总能得到正值

二进制的开关作用

位运算符可以用来检测或设置对象属性的开关,也就是查看或设置二进制形式对应位上的是0(关)或1(开)

& 运算符可以用来检测当前的设置是否打开了指定的开关

// 二进制形式0101
var flags = 5;
// 二进制形式0100
var FLAG = 4;
// 使用 flags & FLAG检测flags是否打开了第三个开关
if(flags & FLAG){
console.log('打开了第三个开关');
}

javascript中的二进制运算符的更多相关文章

  1. 浅析JavaScript中的typeof运算符

    对JavaScript中的typeof运算符进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 如果typeof的运算符是数字.字符串或者布尔值,它返回的结果就是"numb ...

  2. JavaScript中涉及得运算符以及运算符的优先级

    在js中主要有三种运算符:算术运算符,逻辑与比较运算符,位运算符.在着三种运算符中,最常见的应该是算术与比较运算符,位运算符比较少见一些 *说到了运算符,就不得不说运算符的优先级.下面我来列一下这些运 ...

  3. JavaScript中的逗号运算符

    JavaScript逗号运算符  阅读本文的前提,明确表达式.短语.运算符.运算数这几个概念. 所谓表达式,就是一个JavaScript的“短语”,JavaScript解释器可以计算它,从而生成一个值 ...

  4. JavaScript学习系列8 - JavaScript中的关系运算符

    JavaScript中有8个关系运算符,分别是 ===, !===, ==, !=, <, <=, >, >= 1. 恒等运算符 (===) ===也叫做 严格相等运算符,它要 ...

  5. JavaScript学习系列4 ----- JavaScript中的扩展运算符 三个点(...)

    在JavaScript中, ES6开始有rest参数 和 三个点扩展运算符 (spread运算符) 我们来看看他们各自的用处 1. rest参数 rest参数的形式为 ...变量名          ...

  6. Javascript中的位运算符和技巧

    ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...

  7. javaScript 中的布尔运算符 && 和 ||

    布尔运算符 && 和 ||的返回结果不一定是布尔值!由此来展开一定的研究及理解. 1.首先先介绍下常见的数据类型转化为bool后的值. (常用地方)在if表达式中,javascript ...

  8. javascript中的instanceof运算符

    instanceof运算符希望左操作数是一个对象,右操作数表示对象的类:如果左侧的对象是右侧类的实例,则返回true,否则返回false.由于js中对象的类是通过初始化它们的构造函数来定义的,因此in ...

  9. JavaScript中使用typeof运算符需要注意的几个坑

    typeof是一个运算符,它对操作数返回的结果是一个字符串,有6种(只针对ES,不包含HOST环境对象). 1.'undefined'2.'boolean'3.'string'4.'number'5. ...

  10. javascript中的in运算符

    in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望他的又操作数是一个对象:如果右侧对象拥有一个名为左操作数值的属性名,那么表达式返回true: var point = {x:1,y:1}; ...

随机推荐

  1. [OpenCV实战]48 基于OpenCV实现图像质量评价

    本文主要介绍基于OpenCV contrib中的quality模块实现图像质量评价.图像质量评估Image Quality Analysis简称IQA,主要通过数学度量方法来评价图像质量的好坏. 本文 ...

  2. S2-032 CVE-2016-3081 远程代码执行

    漏洞名称 CVE-2016-3081 S2-032 远程代码执行 利用条件 Struts 2.3.20 - Struts Struts 2.3.28 ( 2.3.20.3 和 2.3.24.3 除外) ...

  3. vulnhub靶场之FUNBOX: UNDER CONSTRUCTION!

    准备: 攻击机:虚拟机kali.本机win10. 靶机:Funbox: Under Construction!,下载地址:https://download.vulnhub.com/funbox/Fun ...

  4. [C++Primer] 第二章 变量和基本类型

    第二章 变量和基本类型 引用 引用定义的时候必须初始化. 引用初始化之后无法重新绑定到其它对象上. 引用本身并不是对象,所以没有指向引用的引用(不管如何多层引用,引用的还是源对象) 下面用一个简单的例 ...

  5. Linux C 打印变量数组内容到一个文件中的方法。

    思路: 1.以追加的方式新建打开一个文件 2.将buf 按字节,先将整型转换为字符串,之后写入到文件中. memset(tmp_buf, 0, sizeof(tmp_buf)); sprintf(tm ...

  6. C# 托管堆 遭破坏 问题溯源分析

    一:背景 1. 讲故事 年前遇到了好几例托管堆被损坏的案例,有些运气好一些,从被破坏的托管堆内存现场能观测出大概是什么问题,但更多的情况下是无法做出准确判断的,原因就在于生成的dump是第二现场,借用 ...

  7. 【开源】libinimini:适用于单片机的极简 ini 解析库

    介绍说明 最近自己基于 XR872 在做一个小作品练习练习,具备可以配置的功能,选择了使用 ini 作为配置文件.我调研了网上常见的 ini 解析库,几乎都涉及到了 fopen()/fgets().. ...

  8. 重学SpringBoot. step2 Spring AOP

    Spring AOP AOP的原理,就是生成对象的代理,然后通过在代理的执行中,添加一些钩子来扩展功能. @Aspect public class MyAspect { @Pointcut(" ...

  9. jdbc访问KingbaseES数据库SocketTimeoutException Read timed out

    jdbc访问KingbaseES数据库发生异常:SocketTimeoutException Read timed out 一.异常现象: 应用显示ERROR信息: Caused By: java.n ...

  10. 研发效能DevOps推荐书单

    专注 300 页之内的经典书籍推荐 研发效能涉及的知识很多,从大的方向去划分包括制度.组织.平台.运营等:单从软件研发的角度去看也包括很多,包括最底层的软工认知.实践,到团队管理和组织.敏捷研发,项目 ...