Javascript 位运算符(,|,^,<<,>>,>>>)

embedded/2024/9/25 8:19:26/

文章目录

  • 一、什么是位运算?
  • 二、如何使用
    • 1. 位与(AND):&
      • 用途
        • (1)数据清零
        • (2)判断奇偶
    • 2. 位或(OR):|
      • 用途
        • (1)向下取整
    • 3. 位异或(XOR):^
    • 4. 位非(NOT):~
    • 5. 左移(Left Shift):<<
    • 6. 右移(Right Shift):>>
    • 7. 无符号右移(Unsigned Right Shift):>>>
  • 注意优先级


一、什么是位运算?

位运算是一种对二进制数进行操作的技术,常用于优化算法处理底层数据。在JavaScript中,位运算符包括按位与(&)按位或(|)按位异或(^)左移(<<)右移(>>)无符号右移(>>>)。这些运算符可以对数字的二进制表示进行操作,实现一些特定的位级操作。例如,按位与运算可以用来提取特定位的值,按位或运算可以将特定位设置为1,按位异或运算可以进行位翻转等。通过合理使用位运算,可以提高代码效率和性能

二、如何使用

1. 位与(AND):&

两个位都为 1 时,结果才为 1。

javascript">5 & 3     // 在二进制中是 101 & 011 = 001 (十进制的 1)

用途

(1)数据清零
javascript">// 任何数 & 0都为 0
5 & 0 === 0
(2)判断奇偶

根据最未位是0还是1来决定,为0就是偶数,为1就是奇数

javascript">(a & 1) === 0 等价于 a % 2 === 0;
(5 & 1) === 1;
(4 & 1) === 0;

2. 位或(OR):|

两个位中至少有一个为 1 时,结果为 1。

javascript">5 | 3     // 在二进制中是 101 | 011 = 111 (十进制的 7)

用途

(1)向下取整
javascript">(3.6 | 0) === 3

位运算符| 0的工作原理是利用按位或运算符|将一个数字转换为32位有符号整数。这个操作会将数字的小数部分截断,只保留整数部分。原理如下:

  1. JavaScript中的数字是以64位浮点数的形式存储的,其中包含整数部分小数部分
  2. 当应用位运算符| 0时,会将数字转换为32位有符号整数
  3. 按位或运算符|会对数字的二进制表示的每一位进行按位运算。
  4. 由于32位整数无法表示小数部分,因此在进行按位或运算时,小数部分被截断,只保留整数部分。
  5. 最终的结果是一个32位整数,其中小数部分被丢弃,只保留整数部分。

3. 位异或(XOR):^

两个位相同则结果为 0,不同则结果为 1。

javascript">5 ^ 3     // 在二进制中是 101 ^ 011 = 110 (十进制的 6)

4. 位非(NOT):~

反转操作数的每一位,即将 1 变为 0,将 0 变为 1。

javascript">~5       // 在二进制中是 0000 0101 的 NOT 为 1111 1010,因为 JavaScript 使用 32 位整数,所以结果是 -6

5. 左移(Left Shift):<<

将一个数的所有位向左移动指定的位数,左边空出的位填充 0。左移一位相当于乘以 2 。

javascript">5 << 1    // 101 (5 的二进制) << 1 = 1010 (十进制的 10)
5 << 2    // 101 (5 的二进制) << 2 = 101000 (十进制的 20)

6. 右移(Right Shift):>>

将一个数的所有位向右移动指定的位数,右边空出的位填充符号位(左边最高位的值)。右移一位相当于除以 2 ,且结果总是向零截断。

javascript">5 >> 1    // 101 (5 的二进制) >> 1 = 0101 (十进制的 5)
-5 >> 1   // 1111 1111 1111 1111 1111 1111 1111 1011 (-5 的二进制补码) >> 1 = 1111 1111 1111 1111 1111 1111 1111 1110 (十进制的 -3)

7. 无符号右移(Unsigned Right Shift):>>>

将一个数的所有位向右移动指定的位数,右边空出的位始终填充 0。无符号右移不改变符号位,因此可以用于正数和负数。

javascript">5 >>> 1   // 0000 0101 (5 的二进制) >>> 1 = 0000 0010 (十进制的 2)
-5 >>> 1  // 1111 1111 1111 1111 1111 1111 1111 1011 (-5 的二进制补码) >>> 1 = 1111 1111 1111 1111 1111 1111 1111 1110 (十进制的 2147483646)

注意优先级

在JavaScript中,位运算符优先级相对较低的,位运算符的优先级低于算术运算符(如加法、减法)、关系运算符(如大于、小于)、逻辑运算符(如与、或)等常见运算符。如果表达式中包含多种类型的运算符,需要使用括号来明确指定运算的顺序,以确保逻辑正确性。


http://www.ppmy.cn/embedded/44053.html

相关文章

前端基础入门三大核心之HTML篇 —— IndexedDB详解

前端基础入门三大核心之HTML篇 —— IndexedDB详解 什么是IndexedDB&#xff1f;为什么选择IndexedDB&#xff1f; 基本概念数据库&#xff08;Database&#xff09;对象仓库&#xff08;Object Store&#xff09;索引&#xff08;Index&#xff09;事务&#xff08;Transactio…

日志输出-第三章-接口级出入参输出完整数据的实现

文章目录 日志输出-第三章-接口级出入参输出完整数据的实现一、概述二、如何输出 Request 的 body2.1、工具类2.2、包装类2.3、如何使用 三、如何输出 Response 的 body3.1、包装类3.2、如何使用 日志输出-第三章-接口级出入参输出完整数据的实现 前置内容 日志输出指南日志输…

向npm发布自己写的vue组件,使用vite创建项目

向npm发布自己写的vue组件&#xff0c;使用vite创建项目 创建项目 pnpm create vite输入项目名称 由于我的组件是基于 ant-design-vue和vue的&#xff0c;需要解析.vue文件&#xff0c;我又安装了下面4个。 然后执行 pnpm i安装依赖 vite.config.ts import { defineC…

专业的力量-在成为专家的道路上前进

专业的力量-在成为专家的道路上前进 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 现在稀缺的已不再是信息资源&#xff0c;而是运用信息的能力。过去…

微信小程序路由跳转

1. wx.navigateTo 作用&#xff1a;保留当前页面&#xff0c;跳转到应用内的某个页面。特点&#xff1a;跳转后目标页面的生命周期函数 onLoad 和 onShow 会被触发。使用场景&#xff1a;一般用于跳转到应用内的其他页面&#xff0c;保留当前页面的状态&#xff0c;例如从文章…

渗透测试工具Cobalt strike-2.CS基础使用

三、结合metasploit,反弹shell 在kali中开启使用命令开启metasploit msfconsole ┌──(root㉿oldboy)-[~] └─# msfconsole --- msf6 > use exploit/multi/handler [*] Using configured payload generic/shell_reverse_tcp --- msf6 exploit(multi/handler) > show …

vue3学习(四)

前言 接上篇学习笔记&#xff0c;分享3个内置组件&#xff1a;动态组件、缓存组件、分发组件基本用法。大家一起通过code的示例&#xff0c;从现象理解,注意再次理解生命周期。 一、code示例 组件A&#xff1a;CompA <script setup> import {onMounted, onUnmounted} f…

后端技术栈都有哪些

在后端技术领域&#xff0c;有很多不同的技术栈可供选择&#xff0c;这取决于项目的具体需求、团队的技能和经验以及所使用的框架或库的流行程度。以下是一些常见的后端技术栈的示例&#xff1a; Node.js&#xff1a; 框架&#xff1a;Express.js, Koa.js, NestJS, Hapi.js数据…