LeetCode 冥想——章节位操作

目录

简介按位运算符和 (&)或 (|)异或 (^)不是(~)左移(零填充)(右移(符号保留)(>>)右移(无符号)(>>>)有点设置一点资源

我们已经进入了本系列的最后一章,终于是时候简要介绍一下位操作了。

根据维基百科的定义,按位运算在位串、位数组或二进制数字(被视为位串)的各个位级别上进行运算。

我们首先用二进制(基数 2)表示一个数字。我们可以对数字使用 tostring 方法,并指定 基数:

const n = 17;console.log(n.tostring(2)); // 10001

我们还可以解析一个整数,给它一个基数:

console.log(parseint(10001, 2)); // 17

请注意,我们还可以表示带有前缀 0b 的二进制数:

console.log(0b10001); // 17console.log(0b101); // 5

例如,这些是相同的数字:

0b1 === 0b00000001 // true

javascript 中所有按位运算都是对 32 位二进制数执行的。
也就是说,在执行按位运算之前,javascript 将数字转换为 32 位 **有符号* 整数。*

例如,17 不会只是 10001,而是 00000000 00000000 00000000 00010001。

执行按位运算后,结果将转换回 64 位 javascript 数字。

按位运算符

和 (&)

如果两位都是 1,则结果为 1,否则为 0。

note

the gifs below show the numbers as 8-bit strings, but when doing bitwise operations, remember they are converted to 32-bit numbers.

LeetCode 冥想——章节位操作

const x1 = 0b10001;const x2 = 0b101;const result = x1 & x2; // 1 (0b1)

或 (|)

如果任意一位为 1,则结果为 1,否则为 0。

LeetCode 冥想——章节位操作

const x1 = 0b10001;const x2 = 0b101;const result = x1 | x2; // 21 (0b10101)

异或 (^)

如果各位不同(一位为1,一位为0),则结果为1,否则为0。

LeetCode 冥想——章节位操作

const x1 = 0b10001;const x2 = 0b101;const result = x1 ^ x2; // 20 (0b10100)

不是(~)

翻转位(1 变为 0,0 变为 1)。

LeetCode 冥想——章节位操作

const n = 17;const result = ~n; // -18
note

bitwise noting any 32-bit integer x yields -(x 1).

如果我们使用辅助函数来查看二进制表示,它正如我们所期望的:

console.log(createbinarystring(n));// -> 00000000 00000000 00000000 00010001console.log(createbinarystring(result));// -> 11111111 11111111 11111111 11101110

最左边的位表示信号 – 数字是负数还是正数。

请记住,我们说过 javascript 使用 32 位带符号整数进行按位运算。
最左边的位为 1 表示负数,0 表示正数
此外,运算符对操作数的二进制补码位表示进行运算。 对每一位应用运算符,并按位构造结果。

请注意,二进制补码允许我们获得带有反信号的数字。
一种方法是反转正数表示中数字的位并加 1:

function twoscomplement(n) {  return ~n + 0b1;}

左移(零填充)(

将给定数量的位数向左移动,添加从右侧移入的零位。

const n = 17;const result = n < 00000000 00000000 00000000 00010001console.log(createbinarystring(34));// -> 00000000 00000000 00000000 00100010

请注意,第 32 位(最左边的一位)被丢弃。

右移(符号保留)(>>)

将给定位数向右移动,在从左侧添加位时保留符号。

const n = 17;const result = n >> 1; // 8console.log(createbinarystring(17));// -> 00000000 00000000 00000000 00010001console.log(createbinarystring(8));// -> 00000000 00000000 00000000 00001000
const n = -17;const result = n >> 1; // -9console.log(createbinarystring(-17));// -> 11111111 11111111 11111111 11101111console.log(createbinarystring(-9));// -> 11111111 11111111 11111111 11110111

右移(无符号)(>>>)

将给定位数向右移动,从左侧添加位时添加 0,无论符号是什么。

const n = 17;const result = n >>> 1; // 8console.log(createbinarystring(17));// -> 00000000 00000000 00000000 00010001console.log(createbinarystring(8));// -> 00000000 00000000 00000000 00001000
const n = -17;const result = n >>> 1; // 2147483639console.log(createbinarystring(-17));// -> 11111111 11111111 11111111 11101111console.log(createbinarystring(2147483639));// -> 01111111 11111111 11111111 11110111

得到一点

要获取特定位,我们首先需要创建一个位掩码.
我们可以通过将 1 向左移动我们想要获取的位的索引来实现这一点。
结果是二进制数和位掩码的

但是,使用javascript,我们还可以通过索引进行无符号右移,将位放在第一位(这样我们就无法得到该位置的实际值,但它是否是1或 0):

function getbit(number, idx) {  const bitmask = 1 <>> idx;}

例如,我们尝试 13,二进制为 1101:

const binarynumber = 0b1101;console.log('bit at position 0:', getbit(binarynumber, 0));console.log('bit at position 1:', getbit(binarynumber, 1));console.log('bit at position 2:', getbit(binarynumber, 2));console.log('bit at position 3:', getbit(binarynumber, 3));/*output:bit at position 0: 1bit at position 1: 0bit at position 2: 1bit at position 3: 1*/

设置一点

如果我们想将一位变为 1(换句话说,“设置一点”),我们可以做类似的事情。

首先,我们可以通过将 1 向左移动我们想要设置为 1 的位的索引来再次创建位掩码。
结果是数字和位掩码的

function setbit(number, idx) {  const bitmask = 1 << idx;  return number | bitmask;    }

请记住,在我们的示例中,13 在二进制中是 1101,假设我们要在索引 1 处设置 0:

const binaryNumber = 0b1101;const newBinaryNumber = setBit(binaryNumber, 1);console.log(createBinaryString(newBinaryNumber));// -> 00000000 00000000 00000000 00001111console.log('Bit at position 1:', getBit(newBinaryNumber, 1));// -> Bit at position 1: 1

我们简要地了解了按位运算,以及获取/设置位。在最后一章中,我们将从 1 位数开始讨论五个问题。在那之前,祝您编码愉快。

资源

“javascript 位操作的绝对要点”- lucas f. costajs 位运算符号码(mdn)按位与 (mdn)按位非 (mdn)按位或 (mdn)按位异或 (mdn)左移(mdn)右移(mdn)无符号右移 (mdn)

以上就是LeetCode 冥想——章节位操作的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1499510.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 21:50:35
下一篇 2025年12月19日 21:50:56

相关推荐

  • 如何在 Mac 上退出全屏:分步指南

    高效地浏览 Mac 可以显着提高您的工作效率。 Mac 用户最常见的疑问之一是了解如何退出全屏模式。无论您是在观看电影、处理文档还是探索应用程序,了解如何在全屏和常规视图之间切换都可以让您的 Mac 体验更加流畅。 本指南将引导您了解在 mac 上退出全屏的不同方法,解释全屏模式为何有用,并提供有效…

    2025年12月19日
    000
  • Cisco Packet Tracer 的使用

    简介 Cisco Packet Tracer 是由 Cisco Systems 开发的一款功能强大、免费的网络模拟工具。它被学生、教师和专业人士广泛使用,使用户无需物理硬件即可构建、可视化网络并排除网络故障。该软件对于学习、教学和原型设计各种网络概念很有帮助。 概述Packet Tracer 支持创…

    2025年12月19日
    000
  • 您没有使用(但应该使用)的被低估的 NPM 软件包

    NPM 的世界是广阔的。拥有超过 200 万个可用软件包,您很容易会被一些大牌——React、Lodash、Express——所吸引,而错过一些真正被低估的宝石,这些宝石可以让您作为开发者的生活变得更加轻松。 1。日期-fns-tz无需额外开销即可解决时区问题 时区是最糟糕的。跨时区解析和格式化日期…

    2025年12月19日
    000
  • 如何下载安装天堂js

    您可以通过以下步骤下载并安装天堂 JS:从官方网站下载安装程序。双击 Windows 安装程序文件或使用命令行在 macOS/Linux 上安装。根据提示完成安装即可。 如何下载安装天堂js 步骤 1:下载 前往天堂js官方网站:https://paradise-js.com/在“下载”页面中,选择…

    2025年12月19日
    000
  • 在 Nodejs 中进行身份验证的正确方法 [uide]

    身份验证是后端开发中最关键但经常被误解的方面之一。由于其复杂性,开发人员经常转向第三方解决方案,例如 auth0 或 supabase。虽然这些都是优秀的工具,但构建您自己的身份验证系统可以提供更大的灵活性和控制力。 在本指南中,您将了解如何以最少的依赖关系为 express.js api 服务实现…

    2025年12月19日
    000
  • 什么是 TypeScript 以及为什么要使用它?

    typescript 是一个功能强大的 javascript 扩展,它因使 web 和应用程序开发更加安全、可扩展和高效而广受欢迎。我们将探讨 typescript 是什么、为什么在您的下一个项目中考虑使用它,以及它如何改善您的开发体验。 什么是 typescript? typescript 是一种…

    2025年12月19日
    000
  • JavaScript 数学对象备忘单

    javascript 中的 math 对象提供了一组用于执行数学任务的属性和方法。这是 math 对象的综合备忘单。 属性 math 对象有一组常量: property description value (approx.) math.eeuler’s number2.718math.l…

    2025年12月19日
    000
  • 如何使用计算器:完整指南

    计算器是日常生活和数学、科学、工程和金融等各个知识领域的必备工具。随着技术的发展,计算器已经从简单的手持设备发展成为复杂的数字应用程序。下面,我们从基本模型到最高级的模型,解释如何正确使用计算器。 1. 了解计算器的类型 计算器有很多种类型,每种计算器根据其特点都有特定的功能。以下是最常见的类型: …

    2025年12月19日
    000
  • 元塔

    介绍 点击这里尝试游戏 Meta Tower 是一款数字游戏,由 MetaMakers 小组于 2024 年在技术与领导力学院 – Inteli 本科课程的第一个模块中开发。该项目由 Inteli 和 Meta 公司合作组成,其中学院的学生负责开发和交付该项目。 游戏目标 游戏的主要目标…

    2025年12月19日
    000
  • 在多个注册表之间同步 NPM 包

    照片由 nicolas radzimski 在 unsplash 上拍摄 问题 我们的团队依靠内部 gitlab npm 注册表来管理包。这非常适合内部分发,但在某些情况下需要与外部协作者共享包。将包从内部注册表同步到外部注册表成为一项新的挑战。 我开始寻找解决方案,但像往常一样,遇到了一系列障碍,…

    2025年12月19日
    000
  • Choosing Your Tech Stack: A Developer&#s Journey

    当我第一次踏上编码之旅时,我对可用的编程语言和技术堆栈的数量感到不知所措。感觉就像走进一个广阔的图书馆,每本书都承诺一次不同的冒险,但我不知道从哪里开始。 最初的困惑 作为编码世界的新手,我对不同语言的潜力、各种技术堆栈以及与不同编码相关工作相关的职责知之甚少。我记得我盯着 JavaScript、P…

    2025年12月19日
    000
  • Cypress 与 Selenium:流行测试框架的比较

    Cypress 和 Selenium 是两种最流行的 Web 应用程序测试工具。每个都有其优势和特定的用例,因此根据项目要求、团队技能和测试目标在它们之间进行选择是一个关键决策。本文探讨了 Cypress 与 Selenium 的主要区别、优点和局限性,以帮助您选择适合您的测试需求的工具。 Cypr…

    2025年12月19日
    000
  • MongoDB 服务器综合指南:现代应用程序的数据库

    MongoDB 是一种流行的 NoSQL 数据库,以其处理大规模数据的灵活性、可扩展性和性能而闻名。作为面向文档的数据库,MongoDB 将数据存储在灵活的、类似 JSON 的文档中,非常适合需要管理不同数据类型和结构的应用程序。 MongoDB 服务器广泛应用于各个行业,为从内容管理系统到实时分析…

    2025年12月19日
    000
  • 软件知识

    软件是指用于操作计算机并执行特定任务的指令、数据或程序的集合。它是计算机的无形组件,与物理组件硬件不同。软件有多种类型,每种都有不同的功能: 系统软件操作系统(OS):管理计算机硬件和软件资源并为计算机程序提供通用服务。示例包括 Windows、macOS、Linux 和 Android。实用软件:…

    2025年12月19日
    000
  • node.js 如何

    安装 Node.js 有两种主要方法:使用安装器,前往 Node.js 官方网站并选择与操作系统和架构相匹配的安装器。使用包管理器:Windows:choco install nodejsmacOS:brew install nodeLinux:sudo apt install nodejs Nod…

    2025年12月19日
    000
  • 创建和优化 Grafana 仪表板的综合指南

    Grafana 是一种流行的开源数据可视化和监控工具,使用户能够创建交互式仪表板来跟踪实时指标和数据见解。 Grafana 灵活而强大的设计允许团队构建定制仪表板来监控基础设施运行状况、应用程序性能、业务 KPI 等。本指南将引导您完成设置、自定义和优化 Grafana 仪表板以满足您的监控需求的步…

    2025年12月19日
    000
  • Ubuntu下没有HBuilder怎么办?Vscode 是你的最佳选择吗?

    Ubuntu下的HBuilder替代品 想要寻找一款类比HBuilder的集成开发环境(IDE)?别担心,即使在Ubuntu系统中,也有一些出色的选择。 虽然目前尚未发现与HBuilder完全相似的替代品,但开发者推荐的强大编辑器Vscode是您不错的选择。Vscode拥有丰富的功能,可以满足您的开…

    2025年12月19日
    000
  • 您可能不知道的 useState 性能技巧

    假设我们有一个包含 usestate 的 react 组件。 const expensivecalculation = () => { // …}export default function aboutpage() { const [state, setstate] = usestate…

    2025年12月19日
    000
  • JavaScript JSSSugar 提案、Nodejs Nextjs RCnd 更多

    欢迎来到本周的“本周 JavaScript”! 我们为您提供了一系列令人兴奋的更新,包括关于拆分 JavaScript 的有争议的提案、最新的 Node.js 版本、一些杀手级工具等等。所以系好安全带,让我们开始吧! JavaScript 可能成为两种语言? TC39 围绕一项新提案 —JS0 和 …

    2025年12月19日
    000
  • 使用 React 构建租赁物业管理平台

    movin’ in 是一个面向代理的租赁物业管理平台,具有用于管理物业、客户和预订的后端、用于租赁物业的前端和移动应用程序。 通过以下解决方案,您可以通过将其托管在具有至少 1GB RAM 的 Docker Droplet 上,以非常低的成本构建一个针对多个机构进行优化的完全可定制的房产…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信