c++二进制位运算使用方法
文章主要内容:
C++ 中的位运算符主要用于对整数类型的数据进行位操作,包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、右移(>>)等。这些位运算符可以在二进制位级别上直接操作数据,灵活地进行位操作,实现各种功能和算法。以下是 本期的主要内容:
-
按位与(&):对两个操作数的每一位执行与操作,只有当两个操作数的对应位都为1时,结果相应位才为1。
-
按位或(|):对两个操作数的每一位执行或操作,只要两个操作数的对应位中有一个为1,结果相应位就为1。
-
按位异或(^):对两个操作数的每一位执行异或操作,当两个操作数的对应位不相同时,结果相应位为1;相同时为0。
-
取反(~):对操作数的每一位执行取反操作,即0 变为 1,1 变为 0。
-
左移(<<):将操作数的所有位向左移动指定的位数,并在右侧用 0 填充。
-
右移(>>):将操作数的所有位向右移动指定的位数,并根据符号位或零位进行填充。
正文内容:
1.与运算(&):
运算规则:
在 C++ 中,与运算符(&)用于对两个操作数进行按位与操作。其运算规则如下:
- 如果两个操作数对应位上的值都为1,则结果为1。
- 否则,结果为0。
举个例子:
假设有两个操作数 a = 5 (二进制表示为 0101)和 b = 3 (二进制表示为 0011),进行按位与操作的结果为:
0101 (a)
& 0011 (b)
---------0001
因此,a & b 的结果是 1 (二进制表示为 0001)。
代码():
以下是 C++ 中与运算符(&)的一些具体使用示例代码:
按位与操作:
int a = 5; // 二进制表示为 0101
int b = 3; // 二进制表示为 0011int result = a & b; // 按位与操作,结果为 1,二进制表示为 0001
标记位操作:
const int FLAG_A = 0x01; // 定义标记位 A
const int FLAG_B = 0x02; // 定义标记位 Bint flags = FLAG_A | FLAG_B; // 设置标记位 A 和 B// 检查标记位 B 是否已设置
if (flags & FLAG_B) {std::cout << "标记位 B 已设置" << std::endl;
}
获取变量地址:
int x = 42;
int *ptr = &x; // 获取变量 x 的地址,ptr 指向 x
位运算加密:
char data = 'A'; // 原始数据
char key = 0x0F; // 加密密钥char encryptedData = data & key; // 使用与运算加密数据
这些是与运算符(&)在不同场景下的具体使用示例代码,可以根据实际需求选择适合的应用场景。
应用场景:
在 C++ 中,与运算符(&)有一些常见的适用场景,包括:
-
按位操作:与运算可以用于对两个操作数进行按位与操作,通常用于位操作和位掩码。例如,可以使用与运算来提取数据的特定位或将特定位设置为0。
-
标记位操作:与运算也可以用于设置或清除标记位。通过使用与运算,可以针对特定位进行掩码操作,从而控制或检查标记位的状态。
-
地址操作符:在引用类型变量的声明中,& 运算符用于获取变量的地址。这在指针操作中非常有用,可以通过获取变量的地址来操作变量在内存中的具体位置。
-
位运算加密:与运算可以用于简单的位运算加密算法中,通过与特定的掩码进行运算来对数据进行加密或解密操作。
总的来说,与运算符在 C++ 中适用于需要对数据的位进行操作、设置标记位或进行指针操作等场景。
2.或运算(|):
规则:
在 C++ 中,或运算符(|)用于对两个操作数进行按位或操作。具体来说,或运算的规则如下:
- 如果两个操作数对应位上至少有一个为1,则结果为1。
- 否则,结果为0。
下面是一个简单的例子:
假设有两个操作数 a = 5 (二进制表示为 0101)和 b = 3 (二进制表示为 0011),进行按位或操作的结果为:
0101 (a)
| 0011 (b)
---------0111
因此,a | b 的结果是 7 (二进制表示为 0111)。
应用场景:
或运算符(|)在 C++ 中的适用场景包括:
- 合并位:可以使用或运算符将两个值合并为一个新的值,其中包含两个值的所有位信息。
- 标记位操作:可以使用或运算符将一个或多个标记位设置为1。
- 位掩码操作:可用于应用位掩码,将指定位设置为1。
- 位运算加密和解密应用:与运算符也可以用于简单的位运算加密算法。
具体代码:
以下是关于或运算(|)的一些 C++ 实现代码示例:
合并位操作:
int a = 0b1010; // 二进制表示为 1010
int b = 0b1100; // 二进制表示为 1100int result = a | b; // 按位或操作,结果为 1110(二进制表示)
标记位操作:
const int FLAG_A = 0x01; // 定义标记位 A
const int FLAG_B = 0x02; // 定义标记位 Bint flags = 0; // 初始化标记位// 设置标记位 A 和 B
flags |= FLAG_A;
flags |= FLAG_B;
位掩码操作:
// 定义掩码
unsigned int mask = 0b101;// 对数据进行掩码操作
unsigned int data = 0b110;
data |= mask; // 将掩码值应用到数据中
位运算加密:
char data = 'A'; // 原始数据
char key = 0x0F; // 加密密钥char encryptedData = data | key; // 使用或运算加密数据
这些是关于或运算(|)的一些 C++ 实现代码示例,展示了在不同情景下如何使用或运算符来进行位操作和位运算。
3.异或运算(^):
在 C++ 中,异或运算符(^)用于对两个操作数进行按位异或操作。
规则如下:
- 如果两个操作数对应位上的数值相同(都为0或都为1),则结果为0。
- 如果两个操作数对应位上的数值不同,一个为0,一个为1,则结果为1。
下面是一个简单的例子:
假设有两个操作数 a = 5 (二进制表示为 0101)和 b = 3 (二进制表示为 0011),进行按位异或操作的结果为:
0101 (a)
^ 0011 (b)
---------0110
因此,a ^ b 的结果是 6 (二进制表示为 0110)。
在c++中的应用:
异或运算符(^)在 C++ 中的常见应用包括:
- 交换值:可以使用异或运算符交换两个变量的值,而不需要额外的临时变量。
- 标记位切换:可以使用异或运算符来切换某个标记位的状态。
- 散列函数:在一些散列函数中,异或运算被用来混淆位。
- 检查奇偶性:可以用来检查一个数的奇偶性,异或一个数和1,结果为1则是奇数,为0则是偶数。
-
代码示例(C++):
以下是关于异或运算(^)的一些 C++ 实现代码示例:
交换两个变量的值:
int a = 5;
int b = 3;a = a ^ b;
b = a ^ b;
a = a ^ b;// 现在 a 的值为 3,b 的值为 5
标记位切换:
bool flag = true; // 假设 flag 初始值为 trueflag = flag ^ true; // 切换标记位
// 现在 flag 的值为 false
检查奇偶性:
int num = 7; // 假设 num 为奇数if (num ^ 1) {std::cout << "奇数" << std::endl;
} else {std::cout << "偶数" << std::endl;
}
散列函数中的使用:
int hash = 0;
int data = 0x1234;// 简单的散列函数示例
hash ^= (data << 2);
这些是关于异或运算(^)的一些 C++ 实现代码示例,展示了在不同情景下如何使用异或运算符来进行位操作和提供一些特定功能。
4.取反运算(~):
运算规则介绍:
在 C++ 中,取反运算符(~)用于对一个操作数进行按位取反操作。取反运算符会对操作数的每一位执行取反操作,即将0变为1,将1变为0。具体规则如下:
- 如果某一位是0,则取反后变为1。
- 如果某一位是1,则取反后变为0。
下面是一个简单的例子:
假设有一个操作数 a = 5 (二进制表示为 0101),进行取反操作的结果为:
~0101
-----1010
因此,~a 的结果是 -6 (二进制表示为 1010)。
c++中的应用场景:
取反运算符(~)在 C++ 中通常用于位操作,常见的应用包括:
- 求补数:取反操作是求补数的一种操作,对一个数取反再加1可以得到其补数。
- 清除指定位:可以通过取反操作来清除或者反转特定的位。
- 掩码操作:结合与运算符(&)和或运算符(|)可以使用取反操作来设置或重置特定的位。
c++实现代码:
在 C++ 中,可以使用按位取反运算符(~)对整数进行取反操作。以下是一个简单的示例代码,展示如何在 C++ 中实现取反运算:
#include <iostream>int main() {int num = 5; // 定义一个整数 num,初始值为 5int result = ~num; // 对 num 进行按位取反操作,并将结果存储在 result 中std::cout << "原始值: " << num << std::endl;std::cout << "取反后的值: " << result << std::endl;return 0;
}
在这段代码中,我们定义了一个整数 num,初始值为 5。然后使用取反操作符(~)对 num 进行按位取反操作,并将结果存储在 result 变量中。最后,我们输出原始值和取反后的值。
5.左移运算(<<):
左移运算符(<<)是 C++ 中的位运算符之一,用于将一个数的所有位向左移动指定的位数。具体来说,左移运算符对一个数的二进制表示进行操作,将所有位向左移动指定的位数,并在右侧用 0 填充。
语法使用方法及说明:
左移运算符的语法如下:
result = num << num_bits;
其中,num 是要进行左移操作的数,num_bits 是要向左移动的位数,result 是左移后的结果。
举个例子,假设我们有一个数 5(二进制表示为 00000101),我们对这个数进行左移 2 位的操作:
00000101 << 2
左移 2 位后的结果为:
00010100
将这个二进制数转换为十进制,结果为 20。
c++代码实现左移运算:
以下是一个简单的 C++ 示例代码,演示了左移运算符的使用:
#include <iostream>int main() {int num = 5; // 假设要进行左移操作的数为 5int num_bits = 2; // 左移的位数为 2int result = num << num_bits; // 左移操作std::cout << "原始值: " << num << std::endl;std::cout << "左移后的值: " << result << std::endl;return 0;
}
以上代码定义了一个整数 num 为 5,将其左移 2 位,然后输出左移后的结果。你可以将该代码复制粘贴到 C++ 编译器中运行,查看左移操作的结果。
6.右移运算(>>):
右移运算符(>>)是 C++ 中的位运算符之一,用于将一个数的所有位向右移动指定的位数。具体来说,右移运算符对一个数的二进制表示进行操作,将所有位向右移动指定的位数,并在左侧根据最高位是 0 还是 1 来填充。右移运算符的语法如下:
result = num >> num_bits;
其中,num 是要进行右移操作的数,num_bits 是要向右移动的位数,result 是右移后的结果。
举个例子,假设我们有一个数 20(二进制表示为 00010100),我们对这个数进行右移 2 位的操作:
00010100 >> 2
右移 2 位后的结果为:
00000101
将这个二进制数转换为十进制,结果为 5。
代码:
以下是一个简单的 C++ 示例代码,演示了右移运算符的使用:
#include <iostream>int main() {int num = 20; // 假设要进行右移操作的数为 20int num_bits = 2; // 右移的位数为 2int result = num >> num_bits; // 右移操作std::cout << "原始值: " << num << std::endl;std::cout << "右移后的值: " << result << std::endl;return 0;
}
以上代码定义了一个整数 num 为 20,将其右移 2 位,然后输出右移后的结果。你可以将该代码复制粘贴到 C++ 编译器中运行,查看右移操作的结果。
应用场景:
右移运算符(>>)在 C++ 中有一些常见的应用场景,主要涉及处理整数数据的位操作。以下是一些右移运算的应用场景:
-
算术右移:在处理有符号整数时,可以使用算术右移运算符来对一个数进行有符号右移操作。算术右移会保持符号位不变,即在右移时使用符号位填充空位。这在有符号整数的除法运算中非常有用。
-
位操作:右移运算通常用于对整数进行位操作,可以快速实现对整数进行除以2的操作,即数值右移1位相当于除以2。
-
数据压缩:在一些特定的数据压缩算法中,右移运算可以用来快速减小数据的表示范围,从而减小存储空间。
-
位字段操作:在处理位字段(bit fields)或者位掩码(bitmask)时,右移运算可以帮助提取特定的位。
-
性能优化:在某些情况下,使用右移运算可以取代乘法或除法运算,从而提高代码的执行效率。
总的来说,右移运算在处理位操作、数据压缩以及性能优化等方面具有一定的应用价值。
这些位运算符在 C++ 中非常有用,可以用于实现一些特定的位操作功能或优化性能。如果你有任何关于位运算的问题或需要进一步解释,请随时私信告诉我!
相关文章:
c++二进制位运算使用方法
文章主要内容: C 中的位运算符主要用于对整数类型的数据进行位操作,包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<&#…...
TypeScript之JSON点语法调用
场景 当我们想要通过将JSON中的属性名赋值给一个变量,并且通过点语法实现字段调用.常规的String变量保存会出现下述问题,就可以通过String[][]实现动态调用字段. let parentJSON{"name":"liupeng"}let a:String;Object.keys(parentJSON).forEach(key >…...
手撕Java集合之简易版Deque(LinkedList)
在目前,许多互联网公司的面试已经要求能手撕集合源码,集合源码本身算是源码里比较简单的一部分,但是要在面试极短的10来分钟内快速写出一个简易版的源码还是比较麻烦的,很容易出现各种小问题。所以在平时就要注重这方面的联系。 以…...
MySQL知识点归纳总结(二)
10、MVCC实现原理? 事务ID(Transaction ID):每个事务在执行时都会被分配一个唯一的事务ID,用于标识该事务的开始时间顺序。事务ID是一个递增的整数,随着每个新事务的开始而递增。 Undo日志(Un…...
vue:实现顶部消息横向滚动通知
前言 系统顶部展示一个横向滚动的消息通知,就是消息内容从右往左一直滚动。 效果如下: 代码 使用 <template><div class"notic-bar"><img :src"notic" class"notice-img" /><div class"noti…...
[笔记] wsl 禁用配置 win系统环境变量+代理
wsl 配置禁用 win系统环境变量 进入 wsl 的 /etc/wsl.conf 目录,增加以下配置: [interop] enabledfalse appendWindowsPathfalse然后退出wsl,并且执行关闭正在运行的 wsl,执行命令 wsl --shutdown 最后重新进入wsl 即可。 参考…...
Mysql标量子查询
目录 子查询标量子查询数据准备 子查询 SQL语句中嵌套select语句,称为嵌套查询,又称子查询。 SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2 ... );子查询外部的语句可以是insert / update / delete / select 的任何一个&…...
深入了解Java虚拟机(JVM)
Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释执行Java字节码,并在各种平台上执行。JVM的设计使得Java具有跨平台性,开发人员只需编写一次代码,就可以在任何支持Java的系统上运行。我们刚开始学习Ja…...
Image Fusion via Vision-Language Model【文献阅读】
阅读目录 文献阅读AbstractIntroduction3. Method3.1. Problem Overview3.2. Fusion via Vision-Language Model 4. Vision-Language Fusion Datasets5. Experiment5.1Infrared and Visible Image Fusion 6. Conclusion个人总结 文献阅读 原文下载:https://arxiv.or…...
探索Manticore Search:开源全文搜索引擎的强大功能
在当今信息爆炸的时代,数据的快速检索变得至关重要。无论是在电子商务网站、新闻门户还是企业内部文档,高效的搜索引擎都是确保用户满意度和工作效率的关键因素之一。而在搜索引擎领域,Manticore Search 作为一款开源的全文搜索引擎ÿ…...
AI 笔记助手,你的思路整理助手
大家好,今天给大家介绍一款非常实用的 AI 笔记助手——AI Note。这款助手就像是一个贴心的小助手,能帮助我们整理笔记,提高学习和工作效率。 🤖 AI Note 可以智能总结笔记内容,准确标记重点,让我们更快地获…...
EchoServer回显服务器简单测试
目录 工具介绍 工具使用 测试结果 工具介绍 github的一个开源项目,是一个测压工具 EZLippi/WebBench: Webbench是Radim Kolar在1997年写的一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的…...
车灯修复UV胶的优缺点有哪些?
车灯修复UV胶的优点如下: 优点: 快速固化:通过紫外光照射,UV胶可以在5-15秒内迅速固化,提高了修复效率。高度透明:固化后透光率高,几乎与原始车灯材料无法区分,修复后车灯外观更加…...
探讨倒排索引Elasticsearch面试与实战:从理论到实践
在当前大数据时代,Elasticsearch(以下简称为ES)作为一种强大的搜索和分析引擎,受到了越来越多企业的青睐。因此,对于工程师来说,掌握ES的面试准备和实战经验成为了必备技能之一。本文将从ES的面试准备和实际…...
网安入门18-XSS(靶场实战)
HTML实体化编码 为了避免 XSS 攻击,会将<>编码为<与>,这些就是 HTML 实体编码。 编码前编码后不可分的空格 < (小于符号)< > (大于符号)> & (与符号)&″ (双引号)"’ (单引号)'© (版权符…...
爬虫的一些小技巧总结
一、在爬虫中,爬取的数据类型如下 1.document:返回的是一个HTML文档 2.png:无损的图片,jpg:压缩后的图片,wbep:有损压缩,比png差,比jpg好 3.avgxml图像编码字符串 4.script:脚本文件,依据一定格式编写的可执行的文…...
LeetCode---386周赛
题目列表 3046. 分割数组 3047. 求交集区域内的最大正方形面积 3048. 标记所有下标的最早秒数 I 3049. 标记所有下标的最早秒数 II 一、分割数组 这题简单的思维题,要想将数组分为两个数组,且分出的两个数组中数字不会重复,很显然一个数…...
React之数据绑定以及表单处理
一、表单元素 像<input>、<textarea>、<option>这样的表单元素不同于其他元素,因为他们可以通过用户交互发生变化。这些元素提供的界面使响应用户交互的表单数据处理更加容易 交互属性,用户对一下元素交互时通过onChange回调函数来监听…...
Siamrpn++论文中文翻译(详细!)
SiamRPN: Evolution of Siamese Visual Tracking with Very Deep Networks SiamRPN:具有非常深度网络的Siamese视觉跟踪的进化 【siamrpn论文地址】 https://arxiv.org/abs/1812.11703 摘要 基于Siamese网络的跟踪器将跟踪表示为目标模板和搜索区域之间的卷积特征…...
第一篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas库
传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、主要特点和功能介绍二、Series 示例代码三、DataFrame示例代码四、数据导入/导出示例代码五、数据清洗示例代码六、数据选择和过滤示例代码七、数据合并和连接示例代码八、数据分组和聚…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
