我记不住的那些位操作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,一经查实,立即删除!

相关文章

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…

HCIA 网络基础:

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

Ubuntu开机自动挂载硬盘

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

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

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

智能分析网关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;是不可以直接被计算的。 文本表示的作用就是将这些非结构…

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&…

分布式光伏运维平台在提高光伏电站发电效率解决方案

摘要&#xff1a;伴随着能源危机和环境恶化问题的日益加重&#xff0c;科技工作者进一步加大对新能源的开发和利用。太阳能光伏发电作为新型清洁能源的主力军&#xff0c;在实际生产生活中得到了广泛的应用。然而&#xff0c;光伏发电效率偏低&#xff0c;成为制约光伏发电发展…

机器学习算法实战案例:LSTM实现单变量滚动风电预测

文章目录 1 数据处理1.1 数据集简介1.2 数据集处理 2 模型训练与预测2.1 模型训练2.2 模型滚动预测2.3 结果可视化 答疑&技术交流机器学习算法实战案例系列 1 数据处理 1.1 数据集简介 实验数据集采用数据集5&#xff1a;风电机组运行数据集&#xff0c;包括风速、风向、…

webpack打包可视化分析工具:webpack-bundle-analyzer

在对webpack项目进行优化的时候,可以使用webpack-bundle-analyzer这个可视化插件来快速分析我们包的结构,能快速定位需要优化的地方,对开发者非常友好 下载安装 下载依赖包 npm i webpack-bundle-analyzer 使用 const BundleAnalyzerPlugin require(webpack-bundle-analy…

qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

系统环境&#xff1a;Win10家庭中文版 Qt : 5.12.9 链接了一些64位的第三方库&#xff0c;程序编译完运行后出现 qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" 弹窗如下&#xff1a; 网上搜了一些都是关于pyQt的&#xff0c…

【实战记录】 vagrant+virtualbox+docker 轻松用虚拟机集成组件

用途 最近要学一大堆组件&#xff0c;不想直接安装本机上&#xff0c;然后gpt说&#xff1a;你可以用vagrant起个虚拟机&#xff08;然后docker拉取各种组件的镜像&#xff09;&#xff1b;或者k8s 实战的整体思路 首先安装virtualbox和vagrant。然后cmd依次键入三条命令 安…

旧衣回收小程序搭建:降低企业成本,提高回收效率!

在人们环保意识提升下&#xff0c;旧衣回收行业受到了大众的关注&#xff0c;同时旧衣回收具有门槛低、利润大的优势。在我国&#xff0c;回收行业不仅帮助普通人就业获利&#xff0c;还对环保做出了较大贡献。因此&#xff0c;旧衣回收行业成为了当下的热门商业模式&#xff0…

时尚女童冲锋衣外套

上身时尚又好看的外套 日常穿着或者出行游玩 应对早晚温差&#xff0c;兼具时尚和功能 保暖也可以很轻盈 率性闲适的洒脱范 版型百搭好穿 下摆有橡筋收紧更加保暖了 简直就是一件实用与时尚并存的时尚单品

Swift爬虫程序采集招聘信息代码示例

今天我将用Swift写一个爬虫程序&#xff0c;主要是爬取招聘信息网站得。我们知道Selenops是一个简单的Swift Web爬虫工具&#xff0c;可以用于爬取网页内容。您可以使用Selenops的三种方式之一来进行爬虫操作&#xff1a;Swift游乐场、Swift脚本或马拉松脚本SwiftUI是一种用于构…

100个实战项目——在树莓派4B+Ubuntu20.04桌面版配置下运行智能小车(一)

主机SSH远程链接从机 查看python版本 python 我的是python3.8 所以我需要安装pip3 sudo apt install python3-pip 接着安装程序需要的引脚库 sudo pip3 install RPi.GPIO 注意必须要有sudo&#xff0c;因为我是远程遥控的树莓派&#xff0c;没有权限运行程序&#xff0…