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

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

一、或

或:   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.mzph.cn/news/626669.shtml

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

相关文章

前端知识汇编(持续更新中)

前端知识汇编 1. 浅析cookie sessionStorage localStorage 1. 浅析cookie sessionStorage localStorage cookie、Web Storage 同&#xff1a; 保存在浏览器端都有同源限制&#xff08;cookie&#xff1a;与特定域绑定&#xff0c;不被其他域访问&#xff1b;sessionStorage&a…

自定义shell工具函数之has_config()

这段代码是一个Shell脚本中的函数&#xff0c;名为pull_images。让我来解释一下这段代码的功能&#xff1a; function pull_images() {images_to$(get_images)pids()trap kill ${pids[*]} SIGINT SIGTERMfor image in ${images_to}; dopull_image "$image" &pid…

PDF控件Spire.PDF for .NET【安全】演示:更改 PDF 文档的安全权限

当您使用密码保护 PDF 文档时&#xff0c;您可以选择指定一组权限。权限决定用户如何与文件交互。例如&#xff0c;您可以对文档应用权限以禁止用户打印或使用剪切和粘贴操作。本文演示如何在C# 和 VB.NET中使用Spire.PDF for .NET更改 PDF 文档的安全权限。 Spire.PDF for .N…

HTML5 article标签,<time>...</time>标签和pubdate属性的运用

1、<article>...</article>标签的运用 article标签代表文档、页面或应用程序中独立的、完整的、可以独自被外部引用的内容。它可以是一篇博客或报竟杂志中的文章、一篇论坛帖子、一段用户评论或一个独立的插件&#xff0c;或者其他任何独立的内容。把文章正文放在h…

新喜报,新希望!英码科技荣登“2023年广州拟上市领头羊TOP50企业榜单”

近日&#xff0c;广州市资本市场融资对接服务平台启动仪式暨2023年拟上市企业“领头羊”评选总结活动成功举办。活动现场发布了2023年广州“拟上市领头羊TOP 50 企业榜单”、“最受资本关注TOP10榜单”、“最强科创TOP10榜单”、“最具成长TOP10榜单”并为企业颁发牌匾&#xf…

PHP手机号码归属地批量查询系统 V2024

PHP手机号码归属地批量查询系统 V2024 全部完整代码压缩后只有445KB(代码50.1万行数据); 安全建议:数据库名称DB改为自己指导的名称(本页参数两个文件文件名) 或者伪静态规则&#xff0c;限制.json格式和.db格式文件下载 性能:30条批量查询相应时间0.014秒左右; 数据压缩&#…

HCIA 网络基础:

应用层 抽象语言-->编码 表示层 编码-->二进制 会话层 建立会话&#xff0c;提供绘画地址。 应用于程序内部进行区分&#xff0c;没有统一标准 上三层主要是软件层面&#xff08;应用 程序处理数据&#xff09; 下四层主要负责数据传输 传输层 端口号 分段 &#xff…

【温故而知新】HTML5新标签canvas、MathML

文章目录 一、概念二、新标签三、canvas四、SVG五、MathML 一、概念 HTML5是HTML的最新版本&#xff0c;它引入了许多新的元素和功能&#xff0c;以适应现代网页开发的需求。以下是HTML5的一些主要特点&#xff1a; 新增语义元素&#xff1a;HTML5引入了许多新的语义元素&…

mysql 5.7 函数汇总

mysql 5.7 函数汇总&#xff0c;以下内容由chatgpt中文网 动态生成,助力开发找我 MySQL 5.7 提供了许多内置函数&#xff0c;用于各种数据库操作和数据处理。以下是一些常用的 MySQL 5.7 函数的汇总&#xff1a;字符串函数&#xff1a;CONCAT(): 连接两个或多个字符串。 GROUP…

Ubuntu开机自动挂载硬盘

前言&#xff1a; 因为我的电脑是WIN10 Ubuntu18.04双系统&#xff0c;且两个系统都装在C盘上&#xff0c;而D盘作为数据和代码存储盘&#xff0c;经常会开机就被访问&#xff0c;例如上一次关机前用VS Code访问D盘代码&#xff0c;然后下一次开机的时候打开VSCode发现打不开…

ChatGPT 和文心一言哪个更好用?

文心一言的答案&#xff1a; 在人工智能技术的不断发展下&#xff0c;聊天机器人已经成为我们日常生活和工作中不可或缺的一部分。其中&#xff0c;ChatGPT和文心一言是两款备受关注的聊天机器人&#xff0c;它们各自具有独特的优点和适用场景。本文将就这两个聊天机器人进行简…

在window宿主机访问WSL2内部署的服务

目录 在window宿主机访问 WSL2 内部署的服务&#xff08;其他&#xff09;在 WSL2 内查看 windows&#xff08;宿主机&#xff09;的IP地址 windows内置了Linux系统&#xff08;WSL&#xff09;。 在window宿主机访问 WSL2 内部署的服务 在WSL下部署的项目&#xff0c;比如端口…

C#基础-资源清理-终结器与IDisposable

内容借鉴-C#8.0本质论 终结器 终结器 (finalizer) 允许程序员写代码来清理类的资源。与使用new操作符显式调用构造函数不同&#xff0c;终结器不能从代码中显式调用。没有和new对应的操作符 (比如像delete这样的操作符)。相反&#xff0c;是垃圾回收器负责为对象实例调用终结…

使用git工具把项目文件上传到github 的操作

先打开git-bash进入操作界面 cd D: 进入d盘 mkdir myrepo 创建文件 cd myrepo 进入本地仓库文件 git init 初始仓库 &#xff08;rm -rf .git 取消 git init 命令。&#xff09; git add . git status &#xff08;显示你修改的文件具体是哪些&#xff0…

智能分析网关V4基于AI视频智能分析技术的周界安全防范方案

一、背景分析 随着科技的不断进步&#xff0c;AI视频智能检测技术已经成为周界安全防范的一种重要手段。A智能分析网关V4基于深度学习和计算机视觉技术&#xff0c;可以通过多种AI周界防范算法&#xff0c;实时、精准地监测人员入侵行为&#xff0c;及时发现异常情况并发出警报…

text expressing

文章目录 前言文本表示1文本特征概念介绍2 文本特征选择方法3 文本表示方法 text expressing3.1 One Hot(独热)编码3.2 TF-IDF 模型3.3 Word2Vec 参考链接&#xff1a; 前言 文本是一种非结构化的数据信息&#xff0c;是不可以直接被计算的。 文本表示的作用就是将这些非结构…

解密SHFileOperation

解密SHFileOperation 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在今天的文章中&#xff0c;我们将揭开Windows文件操作的神秘面纱&#xff0c;介绍一款强大而神…

powershell的help

打开win10 的powershell窗口&#xff0c;输入help命令&#xff0c;可以得到如下说明&#xff1a; 有了help系统&#xff0c;可以方便地了解关于powershell的详细说明。

文献阅读(速读):Automating Deep Neural Network Model Selection for Edge Inference

目录 论文简介动机&#xff1a;为什么作者想要解决这个问题&#xff1f;贡献&#xff1a;作者在这篇论文中完成了什么工作(创新点)&#xff1f;规划&#xff1a;他们如何完成工作&#xff1f;自己的看法(作者如何得到的创新思路) 论文简介 作者 Bingqian Lu、Jianyi Yang、Lydi…

cesium设置近地天空盒 天空会倾斜

上篇文章讲解了如何设置近地天空盒&#xff0c;效果出来了还是发现天空是斜的 https://blog.csdn.net/m0_63701303/article/details/135618244 效果&#xff1a; 这里需要修改Cesium.skyBox的代码&#xff0c;代码如下直接全部复制组件内调用即可 skybox_nearground.js&…