ECMAScript 2020:JS 中的有符号左移和无符号右移

在 ECMAScript 2020 中,新增加了两个新的移位运算符:有符号左移(<<)和无符号右移(>>>)。这两个运算符在 JavaScript 中的使用场景相对较少,但是对于算法实现或者某些位运算场景,这两个运算符可以大大减少代码的复杂度和提高执行效率。

什么是有符号左移和无符号右移?

移位运算是指将二进制数中的所有位向左或向右移动指定的位数,根据移动方向不同,移位运算分为左移和右移。在 JavaScript 中,左移运算符用两个箭头(<<)表示,右移运算符用三个箭头(>>>)表示。

对于一个有符号整数(正数或负数),有符号左移相当于将整个数的二进制表示左移指定的位数,并在右边添加 0。例如,10 的二进制表示为 1010,将其有符号左移两位变成 101000,即将原数值的二进制表示左移两个位置,右边补 0。

对于一个无符号整数(只能为正数),无符号右移相当于将整个数的二进制表示右移指定的位数,并在左边添加 0。例如,10 的二进制表示为 1010,将其无符号右移两位变成 0010,即将原数值的二进制表示右移两个位置,左边补 0。

移位运算的使用场景

位运算

在计算机领域,二进制的位运算是一种非常常用的操作方式。而在位运算中,移位操作是其中最基本的操作之一。例如,可以通过位运算将一个十六进制颜色值转换为 RGB 值,或者实现 CRC 校验等算法。

代码优化

对于复杂的数学运算等操作,使用移位运算比使用乘除等运算可以提高代码的执行效率。移位运算可以减少浮点数的运算,加速代码的执行速度。

压缩数据

移位运算还可以用于压缩数据。例如,在压缩文件等操作中使用到的 Huffman 编码算法中就用到了移位运算来压缩数据。

如何使用移位运算符

使用移位运算符非常简单,只需要在需要进行位移的数值前添加左移(<<)或右移(>>>)运算符,并指定需要移动的位数即可。例如:

--- - - --- -- ----
--- - - - -- -- -- ------
--- - - - --- -- -- --

在上面的代码中,我们首先定义了一个变量 a,它的二进制表示为 1010。然后我们使用左移(<<)运算符将 a 左移两位,得到的结果为 101000,即 40。我们还使用右移(>>>)运算符将 a 右移两位,得到的结果为 10,即 2。

注意事项

使用移位运算符时需要注意以下问题:

  • 有符号左移和无符号右移只能用于整数的位运算,不能用于浮点数或者其他类型的数据。
  • 对于负数,有符号左移和右移的结果是不被定义的,应该避免使用。推荐先进行转换,再进行位移操作。
  • 移动的位数必须是一个整数,否则会抛出异常。

总结

在 ECMAScript 2020 中,新增加的有符号左移和无符号右移运算符在 JavaScript 开发中的使用场景相对较少。但是,对于算法实现或者某些位运算场景,这两个运算符可以大大减少代码的复杂度和提高执行效率。在使用时需要注意避免出现负数和使用非整数的位移数。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/654775f67d4982a6eb1d3078


猜你喜欢

  • Material Design 中主题样式修改的技巧

    Material Design 是 Google 推出的一种设计语言,覆盖了移动端、桌面端等领域,为用户提供一致性的视觉体验。在前端开发中使用 Material Design,需要对其主题样式进行修改...

    1 年前
  • Kubernetes 中的 Pod 控制实践

    Kubernetes 是一款开源的容器管理工具,它提供了一种优雅、可扩展的方式来管理 Docker 容器应用。在 Kubernetes 中,一个应用通常被划分为一个或多个 Pod,它们是最小的可部署单...

    1 年前
  • RxJS Ts 过滤操作符详解及使用

    RxJS 是一款功能强大的响应式编程库,在前端领域具有广泛的应用。其中过滤操作符能够帮助开发者在流处理中实现筛选数据的功能,让代码更加简洁和可读。本文将详细介绍 RxJS 中常用的过滤操作符,以及如何...

    1 年前
  • ES10 新特性详解:动态 import() 函数

    随着 Web 技术的快速发展,前端领域的技术也不断地更新换代。在 2019 年发布的 ECMAScript 10(ES10)中,新增了一项非常重要的功能,即动态 import() 函数。

    1 年前
  • 如何使用 Tailwind CSS 以 DIY 方式创建样式并减少 CSS

    随着 Web 应用程序的日益复杂和要求不断增加,管理 CSS 框架变得越来越难。Tailwind CSS 是一种快速、高效的 CSS 框架,可以减少代码量并提高开发速度和效率。

    1 年前
  • 手写 webpack-plugin 和 webpack-loader

    前言 Webpack 是目前流行的前端构建工具,能够将多个 JavaScript 文件打包成一个或多个 bundle 文件,而且还支持各种各样的文件格式的加载和处理,如 CSS、图片等。

    1 年前
  • Serverless 框架搭建与使用指南

    什么是 Serverless? Serverless 是一种新兴的计算模式,简单来说就是无服务器架构。Serverless 的主要特点是将服务提供商的管理权限交给了服务提供商,你只需要提供函数代码,代...

    1 年前
  • Redux Debug 工具使用及介绍

    Redux Debug 工具是一个 Redux 开发者应该了解的必备工具。它提供了一个功能强大的界面,帮助开发人员更好地检查 Redux 状态、分析流程,并追踪错误。

    1 年前
  • 在 ES6 中使用 Set 对象去重

    在前端开发中,很多时候我们需要对数组或其他数据结构进行去重操作。在 ES6 中,我们可以使用 Set 对象来实现去重。在本文中,我们将详细介绍 ES6 中 Set 对象的使用方法,以及如何使用它来去除...

    1 年前
  • Deno 中如何使用 NPM 模块

    前言 Deno 是一个新兴的运行时环境,它允许开发者在 JavaScript 和 TypeScript 这两门语言中进行开发,同时也提供了很多强大的功能,例如内置的模块规范、权限控制等等,使得开发者可...

    1 年前
  • ES6 和 Web Components 在 Polymer 元素中使用 Babel 和 Polymer-Legacy

    随着前端技术的不断发展和演进,越来越多的开发者开始关注 ES6 和 Web Components 技术。在 Polymer 这个 Web Components 框架中使用 ES6 和 Web Comp...

    1 年前
  • 使用 Node.js,MongoDB 和 Express 创建 RESTful API

    RESTful API 是一个基于 REST 架构风格的 Web 服务,可以通过 HTTP 响应来传输数据,使用 Node.js 和 Express 可以轻松创建一个 RESTful API 服务,而...

    1 年前
  • ECMAScript 2020:ES 模块的新导出语法

    ECMAScript 2020:ES 模块的新导出语法 随着前端技术的快速发展,ECMAScript 2020 引入了一些新的语法来提高前端开发的效率。其中,ES 模块的新导出语法是一项非常有用的更新...

    1 年前
  • Fastify 应用中使用 Redis 缓存加速响应速度

    随着互联网应用的不断增加,Web 响应时间已经成为用户最为关注的问题之一。而对于大多数 Web 应用,加快响应速度最好的办法就是使用缓存。在前端开发中,缓存技术更是一项非常重要的技能。

    1 年前
  • CSS Grid 布局中的 grid-template-areas 详解及使用技巧

    在前端开发中,网页的排版和布局是非常重要的。CSS Grid 布局是现今最强大的网页布局工具之一,而其中的 grid-template-areas 则是其中的重要组成部分。

    1 年前
  • 基于 MongoDB 和 Hapi 框架的数据交互实现方法

    前言 在现代 Web 应用中,数据交互是至关重要的一环。而 MongoDB 和 Hapi 框架分别是非常流行的数据库和 Node.js 框架,它们的结合使用可以提供高效、灵活的数据交互实现方案。

    1 年前
  • 如何在 Cypress 中处理弹出框

    Cypress 是一款现代化的前端自动化测试工具,它拥有强大的 UI 操作能力以及易于使用的 API。但是,当你的应用程序需要处理弹出框时,就会给测试工作带来一定的挑战。

    1 年前
  • 使用 Chai 和 Mocha 对 React Native 应用程序进行单元测试

    React Native 是一种流行的跨平台移动应用程序开发框架,它允许开发者使用 JavaScript 和 React 构建高性能、原生应用程序,同时具有简洁的声明式 API 和易于调试的优势。

    1 年前
  • ES7 中 Promise/deferred 异步处理

    ES7 中 Promise/deferred 异步处理详解 在前端开发中,异步处理一直是一个重要的话题。ES7 中引入了 Promise 和 deferred 两个概念,让异步处理变得更加方便和易于维...

    1 年前
  • ES9 中迭代器的扩展操作

    在 ES9 中,迭代器得到了最新的扩展操作。这些扩展操作包括 Array.prototype.flat()、Array.prototype.flatMap() 和 Object.fromEntries...

    1 年前

相关推荐

    暂无文章