首页 > 其他分享 >详解位运算(&、|、^、&^、>>、<<)

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

时间:2024-07-02 20:26:32浏览次数:3  
标签:运算 0011 0010 二进制 0100 1111 详解 0001

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

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

为了方便快速阅读涉及位运算的源码,我们首先需要了解十六进制的 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

标签:运算,0011,0010,二进制,0100,1111,详解,0001
From: https://blog.csdn.net/a2025834646/article/details/140123207

相关文章

  • Redis Sentinal(哨兵模式详解)
    参考文章https://www.cnblogs.com/wzh2010/p/180309071、什么是哨兵模式在实际生产环境中,服务器难免会遇到一些突发状况:服务器宕机,停电,硬件损坏等等,一旦发生,后果不堪设想。哨兵模式的核心还是主从模式的演变,只不过相对于主从模式,在主节点宕机导致不可写的情况下,多了探活,以及竞......
  • dig 命令详解及使用示例
    一、背景知识CNAMECNAME是CanonicalName的缩写,它是DNS(域名系统)记录的一种类型。CNAME记录用于将一个域名映射(别名)到另一个域名。换句话说,当你访问一个设置了CNAME记录的域名时,你实际上被重定向到了另一个域名。例如,假设你有一个域名www.baidu.com,你想让用户通过examp......
  • Python123:找出不是两个数组共有的元素、矩阵运算、方阵循环右移(C语言)
    文章目录1、找出不是两个数组共有的元素2、矩阵运算3、方阵循环右移1、找出不是两个数组共有的元素题目:给定两个整型数组,本题要求找出不是两者共有的元素。输入格式:输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。‪‬‪......
  • iperf详解与实践
    iperf详解与实践目录iperf详解与实践1、iperf介绍1.1简介1.2iperf的主要特点包括:1.3iperf主要测试什么1.4iperf和iperf3区别2、iperf的主要参数说明2.1客户端2.2服务端2.3公共使用3、iperf安装配置示例3.1下载win的iperf版本3.2linux客户端测3.2.1源码编译安装ipe......
  • Next Terminal 一款简单开源轻量级堡垒机,Next Terminal使用详解-(值得收藏)
    1.安装部署:NextTerminal一款简单开源轻量级堡垒机,宝塔Docker安装部署教程一、NextTerminal介绍前沿:NextTerminal是一款开源的轻量级堡垒机与交互审计系统,旨在提供一个集中的、安全的远程访问解决方案,适用于管理不同协议下的服务器与设备。它通过一个统一的Web界......
  • 学习笔记484—Word加载项是灰色怎么解决 Word加载项是灰色的解决方法【详解】
    Word加载项是灰色怎么解决?在Word2016拥有一个加载项的功能,加载项其实就是Word插件,可以实现很多Word自己无法实现的功能,近期有用户发现自己电脑上的Word加载项是灰色的无法使用,这该怎么解决呢?下面我们来看看吧。具体操作如下:1、首先我们打开Word。具体查看图片哦。我这个......
  • 从零到一 Instagram自动运营脚本源码搭建/配置详解
    对于希望在Instagram上实现高效自动运营的用户而言,搭建一套个性化脚本至关重要。本文将从源码层面出发,详解如何从零到一构建并配置Instagram自动运营脚本。一、项目规划明确自动化目标:如提升曝光、增加粉丝、维护用户关系等。设计脚本框架:包括登录模块、任务调度模块、执行模......
  • Python创建异步任务队列库之Huey使用详解
    概要Huey是一个简单的Python库,用于创建异步任务队列。它的设计目标是简单易用,同时具备强大的功能。Huey可以轻松地将任务添加到队列中,然后在后台线程中处理这些任务,从而避免阻塞主线程。这使得Huey非常适合处理I/O密集型或长时间运行的任务。此外,Huey还支持任务的......
  • 详解C++中的容器,其特点与常用方法
    1.容器的定义在C++中,容器的概念是指一种对象类型,它可以持有其他对象或指向其他对象的指针。这种对象类型在数据存储上提供了一种有效的方式来管理一组元素。容器在C++中通常是模板类的形式。一般来说,容器内的元素都是相同类型的。即如果该容器内存放的是int类型的数据,那么......
  • Python层次密度聚类算法库之HDBSCAN使用详解
      概要HDBSCAN是一种层次密度聚类算法,它通过密度连接性来构建聚类层次结构。与传统的K-Means算法相比,HDBSCAN具有以下几个显著特点:自动确定聚类数量:HDBSCAN能够根据数据自动确定聚类数量,不需要预先指定。适应噪声和异常点:HDBSCAN在聚类过程中能够很好地处理......