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. 快速体验,学习lua(一种可嵌入c++,c#,android,object-c等并进行互调支持热更新的脚本)的入门调试系列(3)

    --这里是注释 --[[ 功能备注:lua快速体验,学习,了解语法(调试,类似try-catch) 创建时间:2020-6-27 创建人:pcw --]] print("---------- ...

  2. 学习ASP.NET Core Blazor编程系列十八——文件上传(中)

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  3. c语言学习总结(原创)

    什么是标识符? 标识符是用来标识变量.函数.类.模块,或者任何其他用户自定义项目的名称,用它来命名程序正文中的一些实体,比如函数名.变量名.类名.对象名等.如:int a1=0; const b1=& ...

  4. [机器学习] 特征选择笔记4-使用SelectFromModel特征选择

    特征选择 代码下载 本文主要介绍sklearn中进行特征选择的方法. sklearn.feature_selection模块中的类可用于样本集的特征选择/降维,以提高估计量的准确性得分或提高其在超高维 ...

  5. ArcGIS工具 - 导出空数据库

    有时,需要根据已有的成果数据创建一个空的数据库模板文件,用于新的编辑或对外发布.那么,如果又快又好的创建呢?为源GIS为您编写了一个导出空数据库工具,它可以实现"一键"快速导出任意 ...

  6. python基础练习题 经常更新

    小练习 1.打印出jason l1 = [11, 22, 'kevin', ['tony', 'jerry', [123, 456, 'jason']]] # print(l1[3][2][2]) l ...

  7. Docker 基础 - 3

    Web 服务器与应用 Nginx 我的Nginx Docker镜像 ## 设置继承自己创建的 sshd 镜像 FROM caseycui/ubuntu-sshd ## 维护者 LABEL mainta ...

  8. 剑指Offer 05. 替换空格(java解题)

    目录 1. 题目 2. 解题思路(通用 3. 数据类型功能函数总结 4. java代码 1. 题目 请实现一个函数,把字符串 s 中的每个空格替换成%20. 示例 1: 输入:s = "We ...

  9. Redis01 Redis详细介绍

    参考:https://blog.csdn.net/u011863024/article/details/107476187 学习视频 redis官网 redis中文网 JAVA源码 1 sql的发展 ...

  10. Autodesk Maya2023 破解版安装教程(小白看了也说understand)

    前言 Maya是Autodesk旗下的著名三维建模和动画软件,应用对象是专业的影视广告,角色动画,电影特技等.Maya功能完善,工作灵活,制作效率极高,渲染真实感极强,是电影级别的高端制作软件. 安装 ...