详解位运算(、|、^、^、>>、<<)

十六进制与二进制对应关系

十六进制和二进制之间的转换非常直接,每个十六进制数字直接对应四个二进制位,并且十六进制相对二进制要更加简洁,因此通常书写位操作的代码时会选择使用十六进制来表示数值。

为了方便快速阅读涉及位运算的源码,我们首先需要了解十六进制的 16 个数字和二进制的对应关系,对应关系如下:

  • 0对应0000
  • 1对应0001
  • 2对应0010
  • 3对应0011
  • 4对应0100
  • 5对应0101
  • 6对应0110
  • 7对应0111
  • 8对应1000
  • 9对应1001
  • A对应1010
  • B对应1011
  • C对应1100
  • D对应1101
  • E对应1110
  • F对应1111

&

& 按位与(AND)操作。对于每一位,只有两个操作数相对应的位都是1时,结果位才为1,否则为0。

示例:0x1234 & 0x4321 = 0x0220

计算思路:

16进制各位依次转换为二进制,进行二进制对应位计算。

计算演示(从高位到低位):

1: 0001
4: 0100
0000: 0

2: 0010
3: 0011
0010: 2

3: 0011
2: 0010
0010: 2

4: 0100
1: 0001: 0

res: 0x0220

使用 uint16 仅是因为当前示例为 uint16

| 按位或(OR)操作。对于每一位,如果两个操作数相应的位中至少有一个为1,则结果位为1,否则为0。

示例:0x1234 | 0x4321 = 0x5335

计算思路同 &,简略计算步骤如下:

  1. 0x1234 转二进制:0001 0010 0011 0100
  2. 0x4321 转二进制:0100 0011 0010 0001
  3. 对每一位执行或操作:
    0001 0010 0011 0100
    0100 0011 0010 0001
    -------------------
    0101 0011 0011 0101
    res: 0x5335

^

^ 异或操作(XOR)操作。对于每一位,如果两个操作数对应的位一个为0一个为1,则结果位位1,否则为0。

示例:0x1234 ^ 0x4321 = 0x5115

  1. 0x1234 转二进制:0001 0010 0011 0100
  2. 0x4321 转二进制:0100 0011 0010 0001
  3. 对每一位执行异或操作:
    0001 0010 0011 0100
    0100 0011 0010 0001
    -------------------
    0101 0001 0001 0101
    res: 0x5335

&^

&^ 位清除(AND NOT)操作。对于每一位,如果第二操作数相应的位为1,则结果位为0,否则结果位为第一个操作数相应的位。

示例:0x1234 ^ 0x4321 = 0x1014

  1. 0x1234 转二进制:0001 0010 0011 0100
  2. 0x4321 转二进制:0100 0011 0010 0001
  3. 对每一位执行操作:
    0001 0010 0011 0100
    0100 0011 0010 0001
    -------------------
    0001 0000 0001 0101
    res: 0x1014

<<

<< 左移操作。将操作数的所有位向左移动指定的位数,右边空出的位用0填充。

示例:0xFFFF << 1 = 0xFFFE

  1. 0xFFFF 转二进制:1111 1111 1111 1111
  2. 所有位左移1位,并在末位填充0:
    1111 1111 1111 1110
    res: 0xFFFE

>>

>> 右移操作。将操作数的所有位向右移动指定的位数,左边空出的位的填充方式取决于操作数的类型(对于无符号数用0填充,对于有符号数,通常用符号位填充,但这可能依赖于具体实现)。

无符号整数示例

0xF0 >> 2 = 0x3C

  1. 0xF0 转二进制:1111 0000
  2. 所有位右移2位:
    1111 0000
    0011 1100
    res: 0x3C

有符号整数示例

对有符号整数求右移我们需要首先知道补码的计算方式

计算补码

-16 为例:

  1. 使用二进制表示正160001 0000
  2. 取反(0变1,1变0):1110 1111
  3. 加1:1111 0000
右移

-16 >> 2 = -4

有符号整数:-16(十进制),补码形式为 1111 0000

计算思路:将补码所有位右移2位,高位补符号位(此处为1),得到结果也是补码。

初始:1111 0000,右移2位:1111 1100

反推十进制整数

将补码 1111 1100 转换为十进制需要:

  1. 取反:0000 0011
  2. 加1得到:0000 0100
  3. 转换为十进制:0000 0100 转为十进制为 4
  4. 加上符号:-4

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

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

相关文章

深入探索Scala的类型推断机制

引言 Scala是一种静态类型编程语言&#xff0c;以其强大的类型推断系统而闻名。类型推断允许开发者在很多情况下省略显式的类型声明&#xff0c;从而编写更简洁、更少出错的代码。本文将深入探讨Scala的类型推断是如何实现的&#xff0c;以及它如何帮助提高开发效率和代码可读…

萌啦跨境工具箱有什么作用,萌啦跨境工具箱OZON营销神器

萌啦OZON数据平台&#xff0c;作为专为OZON平台商家打造的数据分析工具&#xff0c;集成了多种强大功能&#xff0c;旨在帮助商家在激烈的市场竞争中获得数据驱动的优势&#xff0c;实现精准运营与高效增长。那么萌啦跨境工具箱有什么作用&#xff1f;接下来介绍萌啦跨境工具箱…

全面升级厨房安全,电焰灶引领新时代

煤气是许多家庭日常使用的能源&#xff0c;目前的普及率还是比较高的&#xff0c;但平时因煤气泄漏而引发的事故也很多&#xff0c;只需要查看最近一个月因液化气泄漏引起的爆炸事件屡见不鲜。打开新闻&#xff0c;我们总能时不时看到煤气爆炸的事故&#xff0c;幸运的能够逢凶…

代码随想录算法训练营day70 | 108. 冗余连接、109. 冗余连接II

本次题目都来自卡码网 108. 冗余连接 无向图&#xff0c;返回一条可以删去的边&#xff0c;使得结果图是一个有着N个节点的树&#xff08;即&#xff1a;只有一个根节点&#xff09;。 从前向后遍历每一条边&#xff08;因为优先让前面的边连上&#xff09;&#xff0c;边的…

【2024LLM应用-数据预处理】之如何从PDF,PPT等非结构化数据提取有效信息(结构化数据JSON)?

&#x1f970;大家知道吗,之前在给AI大模型"喂数据"的时候,我们往往需要把非结构化数据(比如PDF、PPT、Excel等)自己手动转成结构化的格式,这可真是太累人儿了。&#x1f975; 幸好现在有了Unstructured这个神级库,它内置的数据提取函数可以帮我们快速高效地完成这个…

ubuntu 安装并启用 samba

环境&#xff1a;ubuntu server 24.04 步骤如下&#xff1a; sudo apt update sudo apt install samba修改配置文件&#xff1a; sudo vi /etc/samba/smb.conf新增内容&#xff1a; [username]path /home/[username]available yesvalid users [username]read only nobrow…

[Information Sciences 2023]用于假新闻检测的相似性感知多模态提示学习

推荐的一个视频&#xff1a;p-tuning P-tunning直接使用连续空间搜索 做法就是直接将在自然语言中存在的词直接替换成可以直接训练的输入向量。本身的Pretrained LLMs 可以Fine-Tuning也可以不做。 这篇论文也解释了为什么很少在其他领域结合知识图谱的原因&#xff1a;就是因…

什么是客户体验自动化?

客户体验自动化是近年来在企业界备受关注的一个概念。那么&#xff0c;究竟什么是客户体验自动化呢&#xff1f;本文将为您详细解析这一话题&#xff0c;帮助您更好地理解并应用客户体验自动化。 我们要先明确什么是客户体验。客户体验是指客户在使用产品或服务过程中的感受和体…

Android SQLite 数据库存学习与总结

Android 系统内置了一个名为 SQLite 数据库。那么 SQLite 是一种什么样的数据库&#xff0c;它有那些特点&#xff0c;应该怎么操作它&#xff1f;下面&#xff0c;让我们就来认识一下它吧。 1、概念&#xff1a; SQLite 是一种轻量级的关系型数据库&#xff0c;它不仅支持标准…

elementPlus自定义el-select下拉样式

如何在f12元素选择器上找到下拉div呢&#xff1f; 给el-select添加 :popper-append-to-body"false" 即可&#xff0c;这样就可以将下拉框添加到body元素中去&#xff0c;否则当我们失去焦点&#xff0c;下拉就消失了&#xff0c;在元素中找不到el-select。剩下就可以…

洛谷 AT_abc169_d [ABC169D] Div Game 题解

思路 想要让操作次数最多&#xff0c; z z z 就要尽可能小。 由于 z z z 是 N N N 的因数&#xff0c;所以 p p p 就是 N N N 的质因数。 设 N N N 的质因数中有 x x x 个 p p p&#xff0c;则这个 p p p 能执行 y y y 此操作&#xff0c;并且 y y y 满足 ∑ i …

怎么压缩图片大小?6种无需牺牲质量的图片压缩方法

经常处理图片的小伙伴都知道&#xff0c;高质量的图片往往会占据电脑大量的存储空间&#xff0c;导致图片传输及存储的不便。因此&#xff0c;掌握如何压缩图片大小变得尤为重要。本文将详细介绍图片压缩的几种方法&#xff0c;帮助你高效地减小图片文件大小&#xff0c;让你的…

使用多智能体辩论微调大型语言模型

F INE - TUNING L ARGE L ANGUAGE M ODELS WITH MULTI - AGENT D EBATE S UPERVISION DebateGPT: Fine-tuning Large Language M

探究Yarn依赖之源:精通why命令的秘籍

&#x1f575;️‍♂️ 探究Yarn依赖之源&#xff1a;精通why命令的秘籍 在现代JavaScript项目开发中&#xff0c;依赖管理是至关重要的一环。Yarn作为领先的包管理器之一&#xff0c;提供了强大的工具来帮助开发者理解项目依赖的起源和结构。yarn why命令就是这样一个工具&am…

IT专业入门,高考假期预习指南-致有志踏入IT领域的高考少年们

IT专业入门&#xff0c;高考假期预习指南 七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而是新旅程的开始。对于有志于踏入IT领域的高考少年们&#xff0c;这个假期是开启探索IT世界的绝佳时机。 计算机专业是一个综合性非常强…

【.Net】Web项目部署腾讯云

文章目录 总述前置准备docker-compose部署普通部署 参考 总述 前置准备 云服务添加端口 另有linux本身防火墙请参考&#xff1a; 【Linux】防火墙命令 需安装.Net SDK和Asp .Net Runtime 注意&#xff1a; 1、sdk也要不只是runtime 2、是Asp .Net Runtime不是.Net Runtime …

ConcurrentHashMap并发哈希表的设计与实现

ConcurrentHashMap并发哈希表的设计与实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 介绍ConcurrentHashMap 1. ConcurrentHashMap的概述 ConcurrentH…

一个计算密集小程序在不同CPU下的表现

本文比较了几款CPU对同一测试程序的比较结果&#xff0c;用的是Oracle公有云OCI上的计算实例&#xff0c;均分配的1 OCPU&#xff0c;内存用的默认值&#xff0c;不过内存对此测试程序运行结果不重要。 本文只列结果&#xff0c;不做任何评价。下表中&#xff0c;最后一列为测…

搜索型数据库的技术发展历程与趋势前瞻

概述 随着数字科技的飞速发展和信息量的爆炸性增长&#xff0c;搜索引擎已成为我们获取信息的首选途径之一&#xff0c;典型的代表厂商如 Google。然而&#xff0c;随着用户需求的不断演变&#xff0c;传统的搜索技术已经无法满足人们对信息的实时性、个性化和多样性的需求。 …

Qt应用程序中通过上下左右键选择控件,像win桌面图标选择一样

在Qt应用程序中模拟Windows桌面图标的选择行为&#xff0c;即通过上下左右键来移动选择控件&#xff0c;你需要管理一个焦点系统&#xff0c;该系统能够跟踪哪个控件当前被选中&#xff0c;并根据用户的键盘输入来更新这个状态。以下是一个简化的步骤说明和示例代码&#xff0c…