C 和 C++ 编程中的按位运算符
已发表: 2022-12-09在 RAM 中,数据被组织为字节序列。 每个字节包含八个连续的位。 当您想对数据的位执行一些算术运算时, C 和C++ 按位运算符很有用。 它们速度相当快,偶尔用于提高程序的效率。 他们致力于在位级执行操作或以各种方式操作位的位算法。
C&C++中位运算符的类型:
- 按位与
- 按位或
- 按位非
- 按位异或 (XOR)
- 左移运算符
- 右移运算符
让我们详细了解它们中的每一个:
目录
1. 按位与:
C 或 C++ 中的按位与运算符使用单个与号 (&)。 它以两个数字作为操作数并对它们的所有位执行 AND。 仅当两个位都为 1 时,结果才为 1。如果任何位为 0,则结果为 0。本质上, C和 C++中的这个二元运算符对给定两个数字的每个位置的位进行逻辑与运算二进制形式。
例子:
假设两个数字 a 和 b 的二进制表示是:
一 = 01011000
b = 10111001
所以,a & b = 00011000
从上面的例子可以看出,结果只在数字 a 和 b 都为 1 的地方显示“1”。对于所有其他地方,结果显示“0”。
2.按位或:
在 C 和 C++ 中,按位或与按位与非常相似。 唯一的区别是,在按位或运算符中,要使结果中位的位置为“1”,两个位中只有一个应该为“1”。 该运算符将两个数字作为操作数,并对两个数字的每一位执行或运算。
它以下列方式工作:
- 如果两位都为“1”,则结果为“1”。
- 如果两个位都为“0”,则结果为“0”。
- 如果任何位为“1”,则结果为“1”。
它是最简单和最常用的 C++ 按位运算符之一。 它的符号是管道|。 此外,它与布尔逻辑运算符 || 相同。
例子:
假设两个数字 a| 的二进制表示b 是:
一 = 01101001
b = 10111000
所以,一个| b = 11111001
3.按位非:
也称为按位非运算符,它翻转结果中的每一位。 它的符号是波浪号 (~)。 记住此运算符的工作方式的一种简单方法是波浪号有时被称为 twiddle,按位补码旋转每一位。 这意味着如果你有一个 1,结果就是 0,反之亦然。 换句话说, C和 C++中的这个按位运算符接受一个数字并反转所有位。
在确定任何无符号数的最大可能值时,这是最有用的C++ 按位运算符之一。
例子:
无符号整数 = ~0;
这里,0 表示全 0:00000000。因此,实现位非运算符的结果为 1:11111111。因为 num 是一个无符号整数,所以您无需关心符号位或二进制补码。 1s 是结果中可能的最大数字。
按位非运算符的关键特征之一是 2 的补码。 一个数的 2 的补码等于该数的补码加 1。
例子:
一 = 00000000
所以,它的 2 的补码 = -(11111111+1) = -00000000 = -0(decimal)
注意:任意数 N 的按位补码等于 -(N+1)。
从世界一流大学在线学习软件开发课程。 获得执行 PG 课程、高级证书课程或硕士课程,以快速推进您的职业生涯。
4. 按位异或 (XOR):
异或运算接受两个输入,如果其中一个或另一个输入为 1,则输出 1。但如果两者均为 1,则结果为 0。如果两个输入均为 0 或均为 1,则结果为 0。结果仅当两个位不同时,XOR 的 XOR 才为 1。 此二元运算符在 C和 C++ 中的符号是插入符号 (^)。 而且,这种按位运算符在C &C++中简称为XOR。 它对每一对位执行异或运算。 必须注意,没有与此运算符对应的布尔运算符。
例子:
假设我们有两个数字
一 = 10101010
b = 01110010
现在 a ^ b = 10101010 ^ 01110010 = 11011000
您可以通过以下方式理解异或。 假设你有一些位,要么是 0 要么是 1,你称之为 A。现在当你对 A 进行异或 0 时,你将得到 A。 所以,如果 A 为 1,则得到 1,反之亦然。 当您对 A XOR 1 进行异或运算时,这意味着您翻转了 A。因此,如果 A 为 1,则得到 0,反之亦然。
如果你执行两次按位异或运算,即你有两个位,A和B,你设置C = A XOR B,然后执行C XOR B。那么你得到的结果是A XOR B XOR C。它要么翻转 A 的每一位两次,要么不翻转任何位。 因此,您只需按原样取回 A。
您可以将二进制 XOR 运算视为一种选择性旋转。 如果对两个数进行异或,其中一个全为1,结果就相当于一个小游戏。
5. 左移运算符:
此按位运算符将所有位向左移动一定数量的指定位。 左移运算符已经清空的位用0填充,其符号为<<。
在 C 或 C++ 中,它的工作原理是首先取两个数字,将第一个操作数的位左移,第二个操作数指示要将数字移动多少位。
句法:
<<= 5
下面是实现左移运算符的示例 C/C++ 程序:
主函数()
{
整数 = 5;
<<= 2;
count << “x :” << x << endl;
}
输出:a = 20
软件工程热门课程和文章
热门节目 | |||
软件开发执行 PG 课程 - IIIT B | 区块链证书课程 - PURDUE | 网络安全证书计划 - 普杜 | 计算机科学硕士 - IIIT B |
其他热门文章 | |||
2021-22 年美国云工程师薪资 | AWS 解决方案架构师在美国的薪水 | 美国的后端开发人员薪水 | 美国的前端开发人员薪水 |
Web开发人员在美国的薪水 | 2022 年 Scrum Master 面试问题 | 如何在 2022 年开始网络安全职业? | 工程专业学生在美国的职业选择 |
6.右移运算符:
此按位运算符将所有位向右移动一定数量的指定位。 它的符号是>>。 在 C 或 C++ 中,此运算符首先取两个数字,右移第一个操作数的位,第二个操作数指定数字的移位量。
句法:
一个 >>= 5
实现右移运算符的示例 C/C++ 程序:
诠释主要(){
整数 = 5;
一个 >> = 2;
count << “x :” << x << endl;
}
输出:a = 1
软件工程热门课程和文章
热门节目 | |||
软件开发执行 PG 课程 - IIIT B | 区块链证书课程 - PURDUE | 网络安全证书计划 - 普杜 | 计算机科学硕士 - IIIT B |
其他热门文章 | |||
2021-22 年美国云工程师薪资 | AWS 解决方案架构师在美国的薪水 | 美国的后端开发人员薪水 | 美国的前端开发人员薪水 |
Web开发人员在美国的薪水 | 2022 年 Scrum Master 面试问题 | 如何在 2022 年开始网络安全职业? | 工程专业学生在美国的职业选择 |
什么时候应该在 C 和 C++ 中使用按位运算符?
- 节省空间:
按位运算符有助于节省空间。 在单个位级别工作时遇到的一个常见问题是,如果您想要更多空间或节省时间,您可能必须重新设计程序的大部分。 但是在C&C++中使用位运算符可以消除依赖; 例如,您可以使用 ~0 来获得可能的最大整数。 乘以二的位移位是一个典型的操作。 因此,它不会影响可读性,这与位操作的高级使用在某些情况下会产生影响不同。
- 加密:
如果您正在处理某种类型的加密或需要使用位字段来存储布尔属性的系统。
关于按位运算符的独特事实
- 如果不涉及进位,两个数字的按位或只是这些数字的总和。 否则,您只需添加它们的按位与。 例如,假设 x = 5(101) 和 y = 2(010)。 因为不涉及进位,所以总和就是 x|y。 但是,如果我们现在将“x”更改为 6 (110),则总和将更改为 x|y + x&y,因为现在涉及到进位。
- 从技术面试的角度来看,按位 XOR 运算符是最有价值的。 此处讨论了与此相关的面试问题之一的示例。 “对于给定的一组数字,其中包含除了一个数字之外出现偶数次的所有元素,找出奇数出现的数字。” 您需要对所有数字进行异或才能解决此问题。
- 右移和左移按位运算符不得用于负数。 确定移位次数的第二个操作数包含一个负数,这会导致 C 和 C++ 中出现未定义的行为。 例如,1 >>- 1 和 1 << -1 的结果都是未定义的。
- 如果数字的移位超出整数的容量,则行为未指定。 例如,如果整数以 64 位格式存储,则 1 << 65 未指定。
- 如果第二个操作数(决定移位数的那个)为 0,则不会发生移位操作。
使用 UpGrad 开始您的计算机科学之旅:
如果您打算详细了解前端开发(JavaScript、HTML、CSS)、后端(NoSQL-MongoDB)和微服务,那么您可以攻读 UpGrad 的计算机科学理学硕士课程。 本课程由 IIT Bangalore 和 LJMU Alumni Status 提供,可帮助您在世界各地的科技巨头中成为一名软件工程师/全栈开发人员。
该课程包括为初学者和非技术编码人员免费访问职业转型训练营。 您将在本课程中学习十多种编程语言和工具,为您接管行业中的复杂角色做好充分准备。
C++中的位运算符有什么用?
在 C++ 中,按位运算符在二进制级别对整数数据执行运算。 它们对涉及单个位操作的位模式进行操作。 因此,按位运算也称为位级编程。 C++ 中的按位运算符主要用于更快的计算,因为它们仅对两位数字(即 0 和 1)起作用。这些运算符还可以进行测试和移动实际位。
您可以在代码中同时使用左右移位运算符吗?
是的,您可以组合左移和右移运算符,然后,您可以从整数表达式中提取数据。
互补运算符是否翻转了整个代码序列?
不,它没有。 它翻转 1 和 0。 所以,所有的 1 都变成 0,反之亦然。
为什么Bitwise complement operator的另一个名字是one's complement operator?
原因是它总是只接受一个操作数或值。 它是一个一元运算符。 当您对任何位执行补码时,所有的 0 都变成 1,反之亦然。 例如,如果您有一个值为 1111 0000 的整数表达式。执行按位补码运算后,该值变为 0000 1111。