位运算 (运算符)

news2024/11/17 11:45:56

文章目录

    • 位运算
      • 位运算概述
      • 位运算概览
        • & 按位与(AND)
        • | 按位或(bitwise OR)
        • ^ 按位异或(bitwise XOR)
        • ~ 按位非(bitwise NOT)
        • << 左移(bitwise shift left)
        • >> 带符号右移(signed right shift)
      • 复合赋值运算符
      • 二进制运算符
      • JavaScript Number 编码
      • 补码

位运算

  • 位运算
  • 表达式和运算符

位运算概述

从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。

let a = 30;
let b = 43;
let c = a + b;
计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的 let 变量会在机器内部先转换为二进制在进行相加:
30:  0 0 0 1 1 1 1 0
43:  0 0 1 0 1 0 1 1
————————————————————
73:  0 1 0 0 1 0 0 1

相比在代码中直接使用(+、-、*、/)运算符,合理的运用位运算更能显著提高代码在机器上的执行效率。

位运算概览

符号描述运算规则
&两个位都为1时,结果才为1
|两个位都为0时,结果才为0
^异或两个位相同为0,相异为1
~取反0变1,1变0
<<左移各二进位全部左移若干位,高位丢弃,低位补0
>>右移各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
& 按位与(AND)
  • 按位与操作通常用于掩码操作,即用来屏蔽某些位或者检验某些位是否设置。
    // 示例 1:
    //   5: 00000101
    //  10: 00001010
    // &运算: 00000000
    console.log(5 & 10); // 结果是 0
    
| 按位或(bitwise OR)
  • 按位或操作常用于设置(将位设置为1)或合并位标志。
    // 示例 1:
    //   5: 00000101
    //  10: 00001010
    // |运算: 00001111
    console.log(5 | 10); // 结果是 15
    
^ 按位异或(bitwise XOR)
  • 按位异或操作常用于切换位的状态,或者在不使用中间变量的情况下交换两个变量的值。
    // 示例 1:
    //   5: 00000101
    //  10: 00001010
    // ^运算: 00001111
    console.log(5 ^ 10); // 结果是 15
    
~ 按位非(bitwise NOT)
  • 在 JavaScript 中,整数使用补码形式存储。对于按位非操作,其效果可以认为是对操作数加1然后变为相反数(负数),或者可以理解为对操作数的相反数减1
    // 示例 1:
    console.log(~5); // 5 的二进制是 0000 0101,取反得到 1111 1010,这是 -6 的补码表示
    
    // 示例 2:
    console.log(~-1); // -1 的二进制是 1111 1111(所有位都是1),取反得到 0000 0000,这是 0
    
<< 左移(bitwise shift left)
  • 左移操作可以被视为对一个数进行乘法运算,具体地说,将一个数左移n位相当于将这个数乘以2的n次方(2^n)。

    // 示例 1:
    //   1: 00000001 (二进制)
    // 1 << 2: 00000100 (二进制)
    console.log(1 << 2); // 结果是 4 (十进制)
    //对于 1 << 2,数 1 的二进制表示 00000001 被左移了2位,变成了 00000100,这是 4 的二进制表示。
    
>> 带符号右移(signed right shift)
  • 带符号右移操作可以看作是对一个数进行除法运算,具体地说,将一个数右移 n 位相当于将这个数除以 2 的 n 次方(2^n),并且结果向下取整(对于负数来说就是远离零方向取整)。
    // 示例 1:
    //   4: 00000100 (二进制)
    // 4 >> 1: 00000010 (二进制)
    console.log(4 >> 1); // 结果是 2 (十进制)
    
    // 示例 2:
    // -8: 11111000 (二进制的补码表示)
    // -8 >> 2: 11111110 (二进制的补码表示)
    console.log(-8 >> 2); // 结果是 -2 (十进制)
    
    在上面的例子中:
    对于 4 >> 1,数 4 的二进制表示 00000100 被右移了 1 位,变成了 00000010,这是 2 的二进制表示。
    对于 -8 >> 2,数 -8 的二进制补码表示(假定是 8 位)是 11111000,右移 2 位后变成了 11111110,这是 -2 的二进制补码表示。
    

复合赋值运算符

&=       例:a&=b    相当于     a=a&b

|=       例:a|=b    相当于     a=a|b

>>=      例:a>>=b   相当于     a=a>>b

<<=      例:a<<=b   相当于     a=a<<b

^=       例:a^=b    相当于     a=a^b

Number 编码
JavaScript 的 Number 类型是一个双精度 64 位二进制格式 IEEE 754 值,类似于 Java 或者 C# 中的 double。这意味着它可以表示小数值,但是存储的数字的大小和精度有一些限制。简而言之,IEEE 754 双精度浮点数使用 64 位来表示 3 个部分:

1 位用于表示符号(sign)(正数或者负数)
11 位用于表示指数(exponent)(-1022 到 1023)
52 位用于表示尾数(mantissa)(表示 0 和 1 之间的数值)
尾数(也称为有效数)是表示实际值(有效数字)的数值部分。指数是尾数应乘以的 2 的幂次。将其视为科学计数法:

二进制运算符

  • 二进制运算符将它们的操作数作为 32 个二进制位(0 或 1)的集合,并返回标准的 JavaScript 数值。
  • 由于 JavaScript 中的数字是以 IEEE 754 双精度浮点格式存储的,但位运算符会将其操作数转换为32位有符号整数进行操作。因此,结果也是一个32位整数。还需要考虑的是,如果左移操作会导致数值超出32位整数的表示范围,那么结果将会被截断以适应32位整数的范围。

JavaScript Number 编码

  • JavaScript 的 Number 类型是一个双精度 64 位二进制格式 IEEE 754 值,类似于 Java 或者 C# 中的 double。这意味着它可以表示小数值,但是存储的数字的大小和精度有一些限制。简而言之,IEEE 754 双精度浮点数使用 64 位来表示 3 个部分:
    • 1 位用于表示符号(sign)(正数或者负数)
    • 11 位用于表示指数(exponent)(-1022 到 1023)
    • 52 位用于表示尾数(mantissa)(表示 0 和 1 之间的数值)
  • 尾数(也称为有效数)是表示实际值(有效数字)的数值部分。指数是尾数应乘以的 2 的幂次。将其视为科学计数法:在这里插入图片描述
  • 尾数使用 52 比特存储,在二进制小数中解释为 1.… 之后的数字。因此,尾数的精度是 2-52(可以通过 Number.EPSILON 获得),或者十进制数小数点后大约 15 到 17 位;超过这个精度的算术会受到舍入的影响。
  • 一个数值可以容纳的最大值是 21024 - 1(指数为 1023,尾数为基于二进制的 0.1111…),可以通过 Number.MAX_VALUE 获得。超过这个值的数会被替换为特殊的数值常量 Infinity。

只有在 -253 + 1 到 253 - 1 范围内(闭区间)的整数才能在不丢失精度的情况下被表示(可通过 Number.MIN_SAFE_INTEGER 和 Number.MAX_SAFE_INTEGER 获得),因为尾数只能容纳 53 位(包括前导 1)。

有关这部份的更多详细信息,请参阅 ECMAScript 标准。

补码

在计算机系统中,整数通常以补码(two’s complement)形式存储。补码是一种特殊的二进制表示方法,用于编码有符号整数。在补码系统中,正数和0的表示与常规二进制相同,但负数的表示则不同。补码使得加法和减法的运算可以统一处理,简化了计算机的硬件实现。

我们需要了解如何从一个正数的二进制表示得到其负数的补码表示。以下是将正数转换为其负数补码表示的步骤:

写出正数的二进制表示。假设我们要找的是 6 的补码表示。6 的二进制表示(8位表示)是 0000 0110。

对这个二进制数取反(位反)。将所有的 0 变成 1,所有的 1 变成 0。所以 0000 0110 取反后变为 1111 1001。

给取反后的结果加上 1。在我们的例子中,1111 1001 加上 1 结果是 1111 1010。

这个得到的结果 1111 1010 就是 -6 的补码表示。在补码系统中,最左边的位是符号位:0 表示正数,1 表示负数。所以当我们看到 1111 1010 这样的二进制数,最左边的 1 告诉我们这是一个负数。

现在来验证这个结果。为了将补码转换回十进制,我们可以进行以下步骤:

因为符号位是 1,我们知道这是一个负数的补码表示。

我们取它的相反数,即再次取反并加 1。1111 1010 取反得到 0000 0101,加 1 得到 0000 0110。

我们将 0000 0110 转换回十进制,结果是 6。因为我们开始的是一个负数的补码,所以原来的数是 -6。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1359427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zookeeper应用场景之分布式的ID生成器

1. 分布式ID生成器的使用场景 在分布式系统中&#xff0c;分布式ID生成器的使用场景非常之多&#xff1a; 大量的数据记录&#xff0c;需要分布式ID。大量的系统消息&#xff0c;需要分布式ID。大量的请求日志&#xff0c;如restful的操作记录&#xff0c;需要唯一标识&#x…

分布式(7)

目录 31.基于Zookeeper如何实现分布式锁&#xff1f; 32.什么是ACID&#xff1f; 33.什么是分布式的XA协议&#xff1f; 34.什么是2PC&#xff1f; 35.什么是3PC&#xff1f; 31.基于Zookeeper如何实现分布式锁&#xff1f; 顺序节点 创建一个用于发号的节点“/test/lock…

Mybatis缓存实现方式

文章目录 装饰器模式Cache 接口及核心实现Cache 接口装饰器1. BlockingCache2. FifoCache3. LruCache4. SoftCache5. WeakCache 小结 缓存是优化数据库性能的常用手段之一&#xff0c;我们在实践中经常使用的是 Memcached、Redis 等外部缓存组件&#xff0c;很多持久化框架提供…

Unity3D Shader 之透视效果XRay

1、 Shader "Unlit/XRay" {Properties{_MainTex("Texture", 2D) "white" {}// 漫反射_Diffuse("Diffuse", COLOR) (1,1,1,1)// XRay 效果_XRayColor("XRay Color", COLOR) (0,1,1,1)_XRayPower("XRay Power",…

python识别验证码+灰度图片base64转换图片

一、为后面识别验证码准备 1、base64转换为图片&#xff0c;保存本地、并且置灰 上文中的base64,后面的就是包含Base64编码的PNG图像的字符串复制下来 import base64 from PIL import Image import io# 这里是你的Base64编码的字符串 base64_data "iVBORw0KGgoAAAANSUhE…

记录汇川:水塔指令解释-ST

可以通过帮助查看指令手册 PLC的IO地址映射-两种方法 第一种&#xff1a; 新建一个全局变量表&#xff0c;按照如图所示建立IO地址 第二种&#xff1a; 直接如图所示位置定义名字 注意&#xff1a;IW和QB这两个前面一个有蓝色M一个没有。 蓝色的M表示模块发生变化的时候地址不会…

不用愁企业内部知识库搭建啦,照着这样做轻松解决

在现代企业中&#xff0c;知识是一项宝贵的资源。拥有一个完善的内部知识库可以帮助企业有效地管理和分享知识&#xff0c;提高团队的协作效率&#xff0c;促进创新和发展。然而&#xff0c;对于很多企业来说&#xff0c;搭建一个高效的知识库可能会成为一项具有挑战性的任务。…

【docker】cgroups资源限制

目录 一、cpu资源控制 1、 设置cpu使用率上限 2、设置cpu资源占用比&#xff08;设置多个容器时才有效&#xff09;Docker通过–cpu-shares指定cpu份额&#xff0c;默认为1024&#xff0c;值为1024的倍数。 3、设置容器绑定指定的CPU 三、内存资源控制 四、磁盘IO配额控制…

非接触式红外测温MLX90614

1.MLX90614简介 MX90614是一款由迈来芯公司提供的低成本&#xff0c;无接触温度计。输出数据和物体温度呈线性比例&#xff0c;具有高精度和高分辨率。TO-39金属封装里同时集成了红外感应热电堆探测器芯片MLX81101&#xff08;温度是通过PTC或是PTAT元件测量&#xff09;和信号…

原生微信小程序如何动态修改svg图片颜色及尺寸、宽高(封装svgIcon组件)

最终效果 前言 动态设置Svg图片颜色就是修改Svg源码的path中的fill属性&#xff0c; 通过wx.getFileSystemManager().readFile读取.xlsx文件 把文件转成base64 封装svg-icon组件 1、在项目的components下新建svg-icon文件夹&#xff0c;新增base64.js文件 class Base64 {cons…

深圳易图讯实景三维数字孪生系统 实景三维电子沙盘

深圳易图讯实景三维数字孪生系统是一款基于三维地理空间的数字孪生系统&#xff0c;首先&#xff0c;该系统集成了多维度地理空间数据&#xff0c;可以将各类数据与应用需求进行充分整合&#xff0c;实现数据跨界融合、场景全角度可视等功能。其次&#xff0c;该系统具备智能化…

36V到80V降5V1A电源芯片WT6039

36V到80V降5V1A电源芯片WT6039 宽电压12V到90V的降压DC-DC转换器WT6039&#xff0c;功能强大&#xff0c;使用广泛。 WT6039是一款功能非常强大的降压DC-DC转换器芯片&#xff0c;它在12V到90V的宽电压范围内都能正常工作。WT6039不仅具有使能开关控制、参考电源、误差放大器等…

gRPC - 分布式 gRPC 四种通信方式、三种代理方式(全代码演示)

目录 一、分布式 gRPC 开发 1.1、项目结构 & 前置说明 1.1.1、项目结构 1.1.2、protoc 必备依赖 1.1.3、推荐插件&#xff08;简化开发&#xff09; 1.1.4、protoc 生成 Java 代码说明 1.2、一元 RPC&#xff08;代理方式一&#xff1a;阻塞式 BlockingStub&#xff…

深度学习中的准确率、精确率(查准率)、召回率(查全率)、F1值、ROC曲线的AUC值,

混淆矩阵 其中关于 TP, TN; FP, FN 的解释&#xff1b; 其中首字母 T&#xff0c;F代表预测的情况&#xff0c;即T代表预测的结果是对的&#xff0c; F代表预测的结果是错误的&#xff1b; 第二个字母代表预测是预测为 正样本&#xff0c;还是负样本&#xff0c; Positve 代表…

Python实现某城市从站点API获取天气状况示例(Crossin教室实例24)

一、要点说明&#xff1a; 根据站点当前API数据是由‘\r’字符连接的字符串的特点&#xff0c;主要用到了字符串的split()方法。此方法参数就是‘\r’。函数返回值是被分隔的字符串的列表。通过使用列表索引就可以分项取到天气数据。 二、示例代码&#xff1a; import reque…

面试被问了几百遍的 IOC 和 AOP ,一篇文章带你搞清楚!!!

面试被问了几百遍的 IOC 和 AOP &#xff0c;一篇文章带你搞清楚&#xff01;&#xff01;&#xff01; 这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 IoC&#xff1f;IoC 解决了什么问题&#xff1f;IoC 和 DI 的区别&#xff1f;什么是 AOP&#xff…

LeetCode206链表反转

//我来理解一下运用递归求解 class Solution { public:ListNode* reverseList(ListNode* head) {//首先判断是否为最后一个元素if(head null|| head.next null){return head;//返回末尾元素}ListNode* receive;//此时进入循环的每一层都实现了temp接收head.next的结点进行…

解决sublime中文符号乱码问题

效果图 原来 后来 问题不是出自encode文件编码&#xff0c;而是win10的字体问题。 解决方法 配置&#xff1a; { "font_face":"Microsoft Yahei", "dpi_scale": 1.0 } 参考自 Sublime 输入中文显示方框问号乱码_sublime中文问号-CSDN博…

Python新年烟花代码

Pygame 绘制烟花的基本原理 1&#xff0c;发射阶段&#xff1a;在这一阶段烟花的形状是线性向上&#xff0c;通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动&#xff0c;运动过程中 5个点被赋予不同大小的加速度&#xff0c;随着时间推移&#xff0c;后面的…

LeGO-LOAM 安装以及运行

一、源码地址&#xff1a; GitHub - RobustFieldAutonomyLab/LeGO-LOAM: LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable TerrainLeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain - GitH…