返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript中的7种位运算符是如何在实战中使用的
  • 603
分享到

JavaScript中的7种位运算符是如何在实战中使用的

2024-04-02 19:04:59 603人浏览 八月长安
摘要

本篇文章为大家展示了javascript中的7种位运算符是如何在实战中使用的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。位运算符操作符用于数值的底层操作,也就是操

本篇文章为大家展示了javascript中的7种位运算符是如何在实战中使用的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

位运算符

操作符用于数值的底层操作,也就是操作内存中表示数据的比特(位)。

ECMAScript 中的所有数值都以 IEEE 754 64 位格式存储,但位操作并不直接应用到 64 位表示,而是先把值转换为 32 位整数,再进行位操作,之后再把结果转换为 64 位。

开发者而言,就好像只有 32 位整数一样,因 为 64 位整数存储格式是不可见的。既然知道了这些,就只需要考虑 32 位整数即可。

有符号整数使用 32 位的前 31 位表示整数值。第 32 位表示数值的符号,如 0 表示正,1 表示负。这 一位称为符号位(sign bit),它的值决定了数值其余部分的格式。正值以真正的二进制格式存储,即 31 位中的每一位都代表 2 的幂。第一位(称为第 0 位)表示 20 ,第二位表示 21 ,依此类推。

如果一个位是空的,则以0填充,相当于忽略不计。比如,数值18的二进制格式为00000000000000000000000000010010, 或更精简的 10010。后者是用到的 5 个有效位,决定了实际的值(如下图所示)。

JavaScript中的7种位运算符是如何在实战中使用的

按位非

按位非操作符用波浪符(~)表示,它的作用是返回数值的一补数。按位非是 ECMAScript 中为数 不多的几个二进制数学操作符之一。看下面的例子:

let num1 = 25; //二进制 00000000000000000000000000011001
let num2 = ~num1; // 二进制 11111111111111111111111111100110
console.log(num2); // -26

这里,按位非操作符作用到了数值 25,得到的结果是26。由此可以看出,按位非的最终效果是对 数值取反并减 1,就像执行如下操作的结果一样:

let num1 = 25;
let num2 = -num1 - 1;
console.log(num2); // "-26"

实际上,尽管两者返回的结果一样,但位操作的速度快得多。这是因为位操作是在数值的底层表示 上完成的。

按位与 &

按位与操作符用和号(&)表示,有两个操作数。本质上,按位与就是将两个数的每一个位对齐, 然后基于真值表中的规则,对每一位执行相应的与操作。

JavaScript中的7种位运算符是如何在实战中使用的

按位与操作在两个位都是 1 时返回 1,在任何一位是 0 时返回 0。 下面看一个例子,我们对数值 25 和 3 求与操作,如下所示:

let result = 25 & 3;
console.log(result); // 1 25 和 3 的按位与操作的结果是 1。

为什么呢?看下面的二进制计算过程:

JavaScript中的7种位运算符是如何在实战中使用的

如上图所示,25 和 3 的二进制表示中,只有第 0 位上的两个数都是 1。于是结果数值的所有其他位都 会以 0 填充,因此结果就是 1。

按位或

按位或操作符用管道符(|)表示,同样有两个操作数。按位或遵循如下真值表:

JavaScript中的7种位运算符是如何在实战中使用的

按位或操作在至少一位是 1 时返回 1,两位都是 0 时返回 0。 仍然用按位与的示例,如果对 25 和 3 执行按位或,代码如下所示:

let result = 25 | 3;
console.log(result); // 27

可见 25 和 3 的按位或操作的结果是 27:

JavaScript中的7种位运算符是如何在实战中使用的

在参与计算的两个数中,有 4 位都是 1,因此它们直接对应到结果上。二进制码 11011 等于 27。

按位异或 ^

按位异或用脱字符(^)表示,同样有两个操作数。下面是按位异或的真值表:

JavaScript中的7种位运算符是如何在实战中使用的

按位异或与按位或的区别是,它只在一位上是 1 的时候返回 1(两位都是 1 或 0,则返回 0)。 对数值 25 和 3 执行按位异或操作:

let result = 25 ^ 3;
console.log(result); // 26

可见,25 和 3 的按位异或操作结果为 26,如下所示:

JavaScript中的7种位运算符是如何在实战中使用的

两个数在 4 位上都是 1,但两个数的第 0 位都是 1,因此那一位在结果中就变成了 0。其余位上的 1 在另一个数上没有对应的 1,因此会直接传递到结果中。二进制码 11010 等于 26。(注意,这比对同样 两个值执行按位或操作得到的结果小 1。)

左移 <<

左移操作符用两个小于号(<<)表示,会按照指定的位数将数值的所有位向左移动。比如,如果数 值 2(二进制 10)向左移 5 位,就会得到 64(二进制 1000000),如下所示:

let oldValue = 2; // 等于二进制 10
let newValue = oldValue << 5; // 等于二进制 1000000,即十进制 64

注意在移位后,数值右端会空出 5 位。左移会以 0 填充这些空位,让结果是完整的 32 位数值(见下图)。

JavaScript中的7种位运算符是如何在实战中使用的

注意,左移会保留它所操作数值的符号。比如,如果-2 左移 5 位,将得到-64,而不是正 64。

有符号右移 >>

有符号右移由两个大于号(>>)表示,会将数值的所有 32 位都向右移,同时保留符号(正或负)。 有符号右移实际上是左移的逆运算。比如,如果将 64 右移 5 位,那就是 2:

let oldValue = 64; // 等于二进制 1000000
let newValue = oldValue >> 5; // 等于二进制 10,即十进制 2

同样,移位后就会出现空位。不过,右移后空位会出现在左侧,且在符号位之后(见图 3-3)。 ECMAScript 会用符号位的值来填充这些空位,以得到完整的数值。

JavaScript中的7种位运算符是如何在实战中使用的

无符号右移 >>>

无符号右移用 3 个大于号表示(>>>),会将数值的所有 32 位都向右移。对于正数,无符号右移与 有符号右移结果相同。仍然以前面有符号右移的例子为例,64 向右移动 5 位,会变成 2:

let oldValue = 64; // 等于二进制 1000000 
let newValue = oldValue >>> 5; // 等于二进制 10,即十进制 2

对于负数,有时候差异会非常大。与有符号右移不同,无符号右移会给空位补 0,而不管符号位是 什么。对正数来说,这跟有符号右移效果相同。但对负数来说,结果就差太多了。无符号右移操作符将负数的二进制表示当成正数的二进制表示来处理。因为负数是其绝对值的二补数,所以右移之后结果变 得非常之大,如下面的例子所示:

let oldValue = -64; // 等于二进制 11111111111111111111111111000000
let newValue = oldValue >>> 5; // 等于十进制 134217726

在对-64 无符号右移 5 位后,结果是 134 217 726。这是因为-64 的二进制表示是 1111111111111111111 1111111000000,无符号右移却将它当成正值,也就是 4 294 967 232。把这个值右移 5 位后,结果是 00000111111111111111111111111110,即 134 217 726。

实战中的妙用

1.判断奇偶数

// 偶数 & 1 = 0
// 奇数 & 1 = 1
console.log(2 & 1) // 0
console.log(3 & 1) // 1

2. 使用^来完成值的交换

let a = 2
let b = 5
a ^= b
b ^= a
a ^= b
console.log(a) // 5
console.log(b) // 2

3. 使用~进行判断

// 常用判断
if (arr.indexOf(item) > -1) {
    // code
}
// 按位非    ~-1 = -(-1) - 1 取反再 -1
if (~arr.indexOf(item)) {
    // code
}

4. 使用&>>|来完成rgb值和16进制颜色值之间的转换


  function hexToRGB(hex) {
    var hexx = hex.replace('#', '0x')
    var r = hexx >> 16
    var g = hexx >> 8 & 0xff
    var b = hexx & 0xff
    return `rgb(${r}, ${g}, ${b})`
}


function RGBToHex(rgb) {
    var rgbArr = rgb.split(/[^\d]+/)
    var color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3]
    return '#'+ color.toString(16)
}
// -------------------------------------------------
hexToRGB('#ffffff')               // 'rgb(255,255,255)'
RGBToHex('rgb(255,255,255)')      // '#ffffff'

5. 使用|~>><<>>>来取整

console.log(~~ 3.1415)    // 3
console.log(3.1415 >> 0)  // 3
console.log(3.1415 << 0)  // 3
console.log(3.1415 | 0)   // 3
// >>>不可对负数取整
console.log(3.1415 >>> 0)   // 3

上述内容就是JavaScript中的7种位运算符是如何在实战中使用的,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网JavaScript频道。

--结束END--

本文标题: JavaScript中的7种位运算符是如何在实战中使用的

本文链接: https://lsjlt.com/news/88114.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript中的7种位运算符是如何在实战中使用的
    本篇文章为大家展示了JavaScript中的7种位运算符是如何在实战中使用的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。位运算符操作符用于数值的底层操作,也就是操...
    99+
    2024-04-02
  • JavaScript中7种位运算符在实战的妙用
    目录位运算符按位非 ~按位与 &按位或 |按位异或 ^左移 <<有符号右移 >>无符号右移 >>>实战中的妙用1.判断奇偶数2. 使...
    99+
    2024-04-02
  • javascript中位运算符指的是什么
    本篇内容介绍了“javascript中位运算符指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • javascript中&&运算符与||运算符的使用方法实例
    目录前言&&运算符||运算符||运算符的小demo本章目标案例实践(通过加载json渲染数据)结尾总结前言 在前端开发领域中,&&运算符和||运算符...
    99+
    2024-04-02
  • JavaScript中Spread运算符如何使用
    这篇文章将为大家详细讲解有关JavaScript中Spread运算符如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.在log中使用延展操作运算符你...
    99+
    2024-04-02
  • js位运算在实际中如何使用
    这篇文章主要介绍了js位运算在实际中如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇js位运算在实际中如何使用文章都会有所收获,下面我们一起来看看吧。什么是位运算从现代计算机中所有的数据二进制的形式存储在...
    99+
    2023-06-29
  • 如何在Java中使用位运算
    如何在Java中使用位运算?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、位运算的分类与展现效果java位运算可以分为左移和右移,其中右移还有无符号右移。 j...
    99+
    2023-06-15
  • JavaScript如何使用按位双非运算符
    这篇文章给大家分享的是有关JavaScript如何使用按位双非运算符的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。按位双非运算符按位双非运算符可以替代Math.floor()方法。//Longhand ...
    99+
    2023-06-27
  • 在JavaScript中如何使用延展操作运算符
    本篇内容主要讲解“在JavaScript中如何使用延展操作运算符”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在JavaScript中如何使用延展操作运算符”吧...
    99+
    2024-04-02
  • 如何在javascript中使用严格相等运算符
    如何在javascript中使用严格相等运算符?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、说明===严格相等运算符,首先计算其操作数的值,然后比较这两个值,比较过程没...
    99+
    2023-06-15
  • 详解如何在JavaScript中使用三元运算符
    目录正文语法使用三元运算符进行赋值使用三元运算符执行表达式使用三元运算符进行空检查嵌套条件示例结论正文 在本教程中,我们将探讨 JavaScript 中三元运算符的语法及其一些常见用...
    99+
    2022-11-13
    JavaScript 三元运算符 JavaScript 运算符
  • JavaScript中如何使用扩展运算符
    这篇文章给大家介绍JavaScript中如何使用扩展运算符,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。个人对…常用方法的理解…作为扩展运算符这里指的扩展是针对数组或字符串或伪数组(就...
    99+
    2024-04-02
  • 如何在VBS中使用运算符
    今天就跟大家聊聊有关如何在VBS中使用运算符 ,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。VBScript 有一套完整的运算符,包括算术运算符、比较运算符、连接运算符和逻辑运算符。...
    99+
    2023-06-08
  • 如何在php中使用算术运算符
    这篇文章将为大家详细讲解有关如何在php中使用算术运算符,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的P...
    99+
    2023-06-14
  • JavaScript中逗号运算符是怎样使用的
    今天就跟大家聊聊有关JavaScript中逗号运算符是怎样使用的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。逗点算符可与一组表达式运算符相配合,产...
    99+
    2024-04-02
  • javascript中&&运算符与||运算符的使用方法
    本篇文章为大家展示了javascript中&&运算符与||运算符的使用方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言在前端开发领域中,&&运算符和||运算符是...
    99+
    2023-06-25
  • c语言中移位运算符如何使用
    C语言中的移位运算符有两种:左移位运算符()。这两种运算符用于对一个数进行位移操作。左移位运算符(>)和算术右移(>>>)。逻辑右移...
    99+
    2023-09-14
    c语言
  • JAVA中的运算符如何使用
    这篇文章给大家分享的是有关JAVA中的运算符如何使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、算术运算符运算符:常见的±*/等表达式:运算符连接起来符合java语法的式子,比如a+b算术运算符:+ - *...
    99+
    2023-06-25
  • Python中的运算符如何使用
    这篇“Python中的运算符如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的运算符如何使用”文章吧。P...
    99+
    2023-07-06
  • JavaScript中运算符的用法
    本篇内容介绍了“JavaScript中运算符的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JavaS...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作