我记不住的那些位操作bitwise(一)

news2025/1/10 3:36:12

背景: 最近在看底层的一些知识内容,其中有一些位操作,所以想复习并记录一下。

一、或

或:   0 |  1 = 1  及  1 | 1 =1   但是无法区分这两种情况(1. 一个是false,另一个是true; 2. 这两个都是true)

在C语言中,位运算的或使用 单独的 |  ,判断条件的或使用两个 ||

位运算的或,一般用于求 两个位运算的集合的并集,

二、异或

异或XOR(Exclusive or),Exclusive是专有的、独有的意思,也就是专门的一种或 or操作,与普通的or操作不同的是 XOR 主要用来判断两个值是否不同,和普通的或的差异在于 排除了 1 | 1 = 1这种情况。XOR按位不同则返回1,相同的返回0

或: 0 |  1 = 1  及  1 | 1 =1

异或:    1 | 0 =1  及  0 | 1 =1    

也就是说  异或是 或的一个子集,异或将相同的1的这种情况排除了。

x ^ x = 0   自己与自己异或,肯定是0

x ^ 0 = x    自己与0异或,还是自己,因为  0 ^ 0 = 0   0 ^ 1=1 并没有变化。 

1、加密

text ^ key = cipherText

cipherText ^ key =   text ^ key ^ key = text ^ 0 = text

能用在AES的块加密上。

2、也可以用于求两个二进制字符串的汉明距离

从 000 -> 111

S = a ^ b  能求出 从a到b需要变动的位,1代表差异需要变动的位,0代表相同无需变动。

然后求 |S| 这个二进制字符串有多少个1存在,就可以求出汉明距离。

如何求|S|的这个二进制字符串有多少个1 ?

可以通过 S-1 将最小位的1置0并且以及后面的0置1

S&(S-1) 将会 最小位的1置0,然后使用循环逐位置0,最后看S是否为0结束循环并返回1的个数。

可以使用下面的左移或右移或循环等,详细请看下面。

S&(S-1) = 0b+++++000

S^(S-1) = 0b+++++111

S&(-S) = lowbit(S)

3、交换x和y的值

常规的交换是需要一个变量来存储临时的值,而通过异或交换算法,额外的存储是不需要的,算法如下所示:

X := X XOR Y; // XOR the values and store the result in X
Y := X XOR Y; // XOR the values and store the result in Y
X := X XOR Y; // XOR the values and store the result in X

通过三次异或操作来实现交换x和y的值。

4、按位取反

-1在n位的计算机中是 全1的一个串,这里以4位为例,因为负数在计算机中是以补码表示。

有符号数: S\bigoplus (-1)  则将S进行取反,-1代表的是1111

无符号数: S\bigoplus 1111,则将S进行取反

5、多个输入的数据,判断是否这些数据哪些位有奇数个1

0b0101\bigoplus0b1111\bigoplus0b0110=0b1100

最后结果是0b1100  说明第0位和第1位是偶数个1,第2位和第3位是奇数个1

也可以用于奇偶校验位(parity bit),进行错误检测,例如:串口通信中,会有一位是奇数偶数校验位

6、无进位的求和

下面的计算等效于将两个二进制的串进行不考虑进位的情况下的相加操作。

  • 0b1110 XOR 0b1001 = 0b0111 (this is equivalent to addition without carry)

三、应用

1. 案例

假设这个集合代表 学生是否签到,0代表未签到,1代表已签到,一个无符号的4位数字可以代表4个学生,两个集合代表两节不同的课程,那么

并集代表这4个学生中至少签到一节课的人

交集代表着4个学生两节课都签到的人

除 代表着 4个学生签到了第一节课,但是未签到第二节课。

S1:  0101       S2: 0110

两个集合的并集: S1\cup S2  =  0111    // 0号、1号、2号同学 至少签到了一节课

两个集合的交集: S1 \cap S2  =  0100   //  2号同学 签到了两节课

两个集合的除: S1/S2 =S1&(~S2) = 0101 & 1001 = 0001   // 0号同学签到了第一节课,但是未签到第二节课。

2. 求一个字符串中有多少个1

方法1: 通过逻辑右移一位这个数字,同时使之和1进行与操作,直到为0。

方案2: 通过逻辑左移1,逐位与这个数字进行与操作,直到为0。

方案3: 通过 S&(S-1)将最右侧的1置0,这样逐次将最右边的1置0,直到为0。

public int bitCount(int n) {
    int count = 0;
    while (n != 0) {
        n &= n - 1;
        count++;
    }
    return count;
}

方案4: 通过查表,我们使用4位 0000-1111的数字进行存表,例如0000=0,1010=2,然后每次将数字逻辑右移4位来进行查表,得到1的总数。

方案5: 逐位相加,先是每一位相加,每两位相加,每四位相加,每八位相加等等。

int bitset_size1(uint32_t S) { // SIMD
S = (S & 0x55555555) + ((S >> 1) & 0x55555555);
S = (S & 0x33333333) + ((S >> 2) & 0x33333333);
S = (S & 0x0F0F0F0F) + ((S >> 4) & 0x0F0F0F0F);
S = (S & 0x00FF00FF) + ((S >> 8) & 0x00FF00FF);
S = (S & 0x0000FFFF) + ((S >> 16) & 0x0000FFFF);
return S;
}

3. lowbit(x)

求x的最右侧的1的值

lowbit(x)= x & (-x)

假设x为一个有符号数的正数,那么-x则为负数,在计算机中以补码的方式存在。

x的源码为    0010

(-x)原码为    1010

(-x)反码为    1101

(-x)补码为    1110

取反加一,保证了最低位的1并没有变化,而左侧的其他位置均进行了变化。

发现将 x与(-x)进行与操作,可以得到最右侧的1的值。

x & (x-1) = 0b+++++000;

x ^ (x-1)  = 0b00000111;

x & (-x)   =  0b00000100 (lowbit)

这个lowbit操作在 树状数组中有使用。

4. 求 \left \lfloor \log _{2}x \right \rfloor  

也就是求x的最左侧的1的位数

clz(Count Leading Zeros)用于求前导0的个数。

假设有32位数字, n = 32-clz(x) -1 为\left \lfloor \log _{2}x \right \rfloor  的值,即 00..0 2^{n}.....2^{0}

clz(x) + n + 1 = 32

int clz(uint32_t x) {
    int n = 0;
    if (x <= 0x0000ffff) n += 16, x <<= 16;
    if (x <= 0x00ffffff) n += 8, x <<= 8;
    if (x <= 0x0fffffff) n += 4, x <<= 4;
    if (x <= 0x3fffffff) n += 2, x <<= 2;
    if (x <= 0x7fffffff) n ++;
    return n;
}

参考文献:

0.Shift and rotate bits - Online Tools

1. https://en.wikipedia.org/wiki/Bitwise_operation

2. That XOR Trick

3. https://en.wikipedia.org/wiki/Hamming_distance

4.https://en.wikipedia.org/wiki/XOR_swap_algorithm

5.bit manipulation - The difference between logical shift right, arithmetic shift right, and rotate right - Stack Overflow

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

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

相关文章

蓝桥杯:随意组合

题目描述&#xff1a; 算法思路&#xff1a; 主要是将其中一个数组进行全排列&#xff0c;16中排列顺序&#xff0c;再与 另外一个数组进行匹配求和。在这里就要用到next_permutation()函数&#xff0c;具体用法就是直接用数组a[]&#xff0c;进行排序next_permutation(a&…

外汇天眼:35家非法外汇平台被拉黑,两个实体因诈骗被罚!

上周&#xff0c;有35家外汇平台被监管列入黑名单&#xff0c;两个实体因诈骗被罚。具体新闻如下&#xff1a; 法国AMF将35家非法外汇平台列入风险名单 为了保护散户投资者&#xff0c;法国金融市场管理局AMF在上周&#xff0c;将35个未被监管授权的外汇交易商网站列入监管风险…

什么是虚拟DOM?如何实现一个虚拟DOM?

面试官&#xff1a;什么是虚拟DOM&#xff1f;如何实现一个虚拟DOM&#xff1f;说说你的思路 一、什么是虚拟DOM 虚拟 DOM &#xff08;Virtual DOM &#xff09;这个概念相信大家都不陌生&#xff0c;从 React 到 Vue &#xff0c;虚拟 DOM 为这两个框架都带来了跨平台的能力…

达摩研究院Paraformer语音识别-中文-通用-16k

原文&#xff1a;https://github.com/alibaba-damo-academy/FunASR/blob/main/runtime/readme_cn.md FunASR软件包路线图 English Version&#xff08;docs&#xff09; FunASR是由阿里巴巴通义实验室语音团队开源的一款语音识别基础框架&#xff0c;集成了语音端点检测、语…

第09章_异常处理拓展练习(代码阅读题,简答题,编程题)

文章目录 第09章_异常处理拓展练习代码阅读题1、阅读代码&#xff0c;分析结果2、阅读代码&#xff0c;分析结果3、阅读代码&#xff0c;分析结果4、阅读代码&#xff0c;分析结果5、阅读代码&#xff0c;分析结果6、阅读代码&#xff0c;分析结果7、阅读代码&#xff0c;分析结…

插件和工具汇总

插件和工具汇总 【一】MyBatis Log插件【二】热部署&#xff08;1&#xff09;适用于IntelliJ IDEA 2021.X以上版本&#xff08;2&#xff09;适用于IntelliJ IDEA 2021.X以下版本 【三】一些快捷键 【一】MyBatis Log插件 能够自动拼接参数生成执行的SQL语句&#xff0c;可以…

蔚来,为何要狂“炫技”?

有人说&#xff0c;蔚来NIO Day2023就是“炫技”的一晚。 当晚&#xff0c;蔚来发布一款更小众的新车型——ET9&#xff0c;定位D级行政旗舰车型&#xff0c;发布会大部分时间在介绍核心自研技术&#xff0c;包括首颗自研智能驾驶芯片——神玑NX9031、全域900V高压架构、天行智…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子明细实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

STM32CubeMX配置STM32G071UART+DMA收发数据(HAL库开发)

时钟配置HSI主频配置64M 配置好串口&#xff0c;选择异步模式 配置DMA TX,RX,选择循环模式。 NVIC中勾选使能中断 勾选生成独立的.c和h文件 配置好需要的开发环境并获取代码 串口重定向勾选Use Micro LIB main.c文件修改 增加头文件和串口重定向 #include <string.h&g…

微软推出Copilot Pro高级订阅服务;使用大语言模型处理音频数据;AI新工具Summify-用于总结YouTube视频的人工智能工具

&#x1f989; AI新闻 &#x1f680; 微软推出Copilot Pro高级订阅服务&#xff0c;扩展适用范围到更多设备和应用 摘要&#xff1a;微软为其Copilot助手推出了新的高级订阅服务Copilot Pro&#xff0c;该服务每月收费20美元&#xff0c;支持Windows PC、Web、App使用&#x…

Win11提示"由于启动计算机时出现了页面文件配置问题"解决方法

1.右键此电脑&#xff0c;选择属性 2.选择高级系统设置 3.选择性能 ---设置 4.选择高级--更改 5.勾选...&#xff0c;确定 本文章仅供学习交流使用&#xff0c;如有侵权&#xff0c;联系删除

二叉树的四种遍历详解(先序,中序,后序,层次)

目录 引言&#xff1a; 1&#xff1a;先序遍历 2.中序遍历 3.后续遍历 4.层次遍历 先序中序后序例题&#xff1a; 例题1&#xff1a; 例题2&#xff1a; 层次遍历例题&#xff1a; 结语&#xff1a; 引言&#xff1a; 二叉树的遍历的概念&#xff1a;二叉树遍历是指…

GZ075 云计算应用赛题第10套

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷10 某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenS…

管理configration Manager 控制台

一、configration manager客户端安装 1.点击管理&#xff0c;扩展站点配置&#xff0c;点击站点 2.右键主站点&#xff0c;选择客户端安装设置 3.出现客户端请求安装属性对话框后&#xff0c;点击常规。点击启用自动站点范围客户端请求安装 4.点击账户 5.点击安装属性&#x…

Windows 10 Microsoft Edge浏览器无法打

早上到公司发现Microsoft Edge浏览器突然间打不开了&#xff0c;怎么点击快捷方式都不行&#xff0c;然后尝试了以下方法都不行&#xff1a; 1、右键使用“管理者身份运行”打开&#xff0c;无效。 2、账户注销&#xff0c;再次点击快捷方式。 3、重启电脑无效。 然后快捷方式右…

轻松制作商业画册的秘籍

对于许多商业人士来说&#xff0c;制作一本精美的商业画册是一个重要的任务&#xff0c;它不仅代表了公司的形象&#xff0c;也是与客户和潜在客户建立联系的重要工具。然而&#xff0c;制作一本商业画册并不像看起来那么简单。有许多因素需要考虑&#xff0c;包括设计、布局、…

当代大学生是怎么被废掉的?

中式教育以应试为核心&#xff0c;强调知识的灌输和学生被动接受。随着社会的发展&#xff0c;中式教育的短板逐渐显现&#xff0c;创新能力的缺乏、对记忆的过度依赖、忽视个体差异等问题日益突出。 建议所有大学生都能去看看《上海交通大学生存手册》&#xff0c;它道出了中…

前任开发在代码里下毒了,支付下单居然没加幂等

分享是最有效的学习方式。 故事 又是一个风和日丽没好的一天&#xff0c;小猫戴着耳机&#xff0c;安逸地听着音乐&#xff0c;撸着代码&#xff0c;这种没有会议的日子真的是巴适得板。 不料祸从天降&#xff0c;组长火急火燎地跑过来找到了小猫。“快排查一下&#xff0c;目…

C++内存管理机制(侯捷)笔记3

C内存管理机制&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youtube: 侯捷-C内存管理机制 Github课程视频、PPT和源代码: https://github.com/ZachL1/Bilibili-plus 第三讲&#xff1a;malloc和…

如何手写一个RPC?

在学习 RPC 框架之前&#xff0c;我们先来手写一个RPC。 我们在学习的过程中&#xff0c;一定要做到知其然&#xff0c;还要知其所以然。 架构演进 单体架构 要知道&#xff0c;在以前单体架构的时候&#xff0c;会将所有的应用功能都集中在一个服务当中。 单体架构初始开发…