C++ 按位运算符2024年8月28日 | 阅读 11 分钟 位可以通过多种方式使用 位运算符 来管理。我们使用 位运算符(如 (|, &, ^, ~, <<, >>) 来处理位,以及使用 数学运算符(如 (+, -, /, *) 来处理整数,其方式是等效的。 在本文中,我们将探讨 C++ 中六种不同类别的 位运算符。在 C++ 中,我们将理解它们的内部工作原理和语法。
虽然其中一些 运算符的名称 和 符号 可能与逻辑运算符相似,但它们不能互换使用。 C++ 中的位运算符与逻辑运算符对于初学者来说,位运算符,如 AND、OR 和 XOR,可能会令人困惑。 如果您之前学习过 逻辑运算符,那么 逻辑 AND 和 逻辑 OR 可能对您来说很熟悉。许多人认为它们经常与 位 AND 和 位 OR 运算符 混淆。让我们试着找出它们之间有什么区别。逻辑运算符 使用 布尔数据,并输出 True 或 False 布尔值。 C++ 中的位运算符 在整数上操作;也就是说,它们接受整数输入,执行 位操作,然后返回 整数输出。而 逻辑 AND 和 OR 使用 '&&' 和 '||' 作为它们的运算符,位 AND 和 OR 则使用 '&' 和 '|'。 C++ 中的位运算符类型既然您已经了解了 逻辑运算符 和 位运算符 之间的区别以及位运算符是什么,让我们更仔细地了解一下它们。 AND (&) 运算符位 AND 运算符 使用 单个 & 符号 来表示。这个 二元运算符 需要 两个操作数,即 两个数字 才能工作。 它对 左 和 右 操作数的二进制值执行 位级别的逻辑 AND 运算符。也就是说,如果两个操作数在期望的位置上都有 1,则输出在该位置上也将是 1,否则为 0。 C++ 中位 AND 运算符的真值表
示例 输出 3 & 4 = 0 工作机制 上面的代码片段执行了 3 和 4 的 按位与 操作。让我们仔细看看它们是如何工作的。
OR 运算符按位与 和 按位或 运算符之间的唯一区别是 按位或 运算符在 位级别 执行逻辑 OR 而不是逻辑 AND。也就是说,如果至少一个操作数具有 1,则结果在相应位置上也将具有 1,如果它们在相应位置上都具有 0,则结果为 0。竖线 或 管道符号,即 |,用于表示此运算符。 C++ 中位 OR 运算符的真值表
示例 输出 3 | 4 = 7 工作机制 上面的代码片段执行了 3 和 4 的 按位或 操作。让我们仔细看看它们是如何工作的。
XOR 运算符与前两个相比,主要区别在于它们在 位级别 执行逻辑 XOR。也就是说,如果仅有一个操作数具有 1 而另一个具有 0,则结果在相应位置将具有 1。如果它们都具有相同的位,例如都为 0 或都为 1,则结果将为 0。 C++ 中位 XOR 运算符的真值表
示例 输出 3 ^ 4 = 7 工作机制 上面的代码片段执行了 3 和 4 的按位 XOR 操作。让我们仔细看看它们是如何工作的。
在继续其他运算符之前,让我们看一下我们到目前为止已经检查过的 C++ 中三个位运算符的 真值表。
表: C++ 中位 AND、OR 和 XOR 操作的通用真值表。 Complement 运算符如果您观察到了,到目前为止我们看到的三个位运算都是二元运算符,这意味着它们都需要 两个操作数 才能工作。然而,这个运算符是不同的,因为它是唯一只需要 一个操作数 的位运算符。其他位运算需要 两个运算符。 按位补码 运算符返回单个值的 一的补码。数字的 一的补码 是通过将二进制值的 所有 0 转换为 1,将 所有 1 转换为 0 来创建的。它由 波浪号,即 '~' 来表示。 C++ 中位补码运算符的真值表
示例 输出 ~5 = -6 工作机制 上面的代码片段执行了 5 的按位 补码操作。翻转 所有位会得到 101,转换为十进制是 010,即 2。 注意
到目前为止,我们已经介绍了 C++ 中的 4 种位运算符。它们都在 位级别 上执行与 逻辑运算符 在 布尔变量 上执行的相同操作,这使得它们与逻辑运算符非常相似。然而,接下来的两个运算符彼此之间存在显著差异。 Left Shift (<<) Operator左移运算符 将指定数量的位向 左 移动整数值的位模式。左移运算符 需要两个操作数:要移动的 值,例如 “x”,以及第二个值,例如 “n”,表示需要将 第一个值 向 左 移动的位数。 如果 “n” 的值为负,则会引发编译器错误 “负移位计数”。“x” 的值可以是 负数,但 “n” 的值不能是负数。当 'x' 的值为 负数 时,对数字的 2 的补码 应用 左移 操作。因此,数字的符号可能与 左移操作 的符号匹配,也可能不匹配。 两个连续的大于 运算符,或 <<,用于表示 左移运算符。如果 n 是 运算符右侧 的操作数,则相当于将整数乘以 2 的 n 次方。 为什么会这样?许多人问这是一个非常明确的问题,因为当一个数字向左移动时,它的基值会乘以 新数字。当您在十进制中将 3 的值向 左 移动并向其 最右侧 添加 0 时,您实际上是在乘以 10,这是它的基值。 例如,如果您将 3 向 左 移动 1 位,您将得到 30,即 3*10。任何基值都具有相同的属性。左移 运算符仅对二进制数据进行操作。因此,结果与乘以 2 的幂相同。 语法 它具有以下语法: 示例 输出 5 << 2 = 20 工作机制
Right Shift (>>) Operator右移 和 左移 运算符之间的主要区别在于 右移 运算符将位向 右 移动而不是 左 移动。其余的位通过弹出提供的值的最后 n 位,从二进制转换为整数。 右移 运算符遵循与 左移运算符 相同的指南。如果 “n” 的值为 负数,则会引发编译器错误 “负移位计数”。“x” 的值可以是 负数,但 “n” 的值不能是负数。 使用 右移运算符 对 负数 进行操作时,与 左移运算符 一样,使用的是数字的 2 的补码。 因此,当您对 负整数 执行 右移操作 时,结果将是一个 正数,因为您将符号位替换为 0,将之前的位(即 1)移到下一个位置。两个连续的小于 符号,或 >>,用于表示此运算符。 语法 它具有以下语法: 它相当于使用 n 的 second power 将给定整数除以其地板值。 当您将数字向 右 移位时,就像向 左 移位 时一样,您实际上是在除以 基值。当您在十进制中将数字 345 向 右 移位 并 弹出 最后一个字符时,您实际上是在除以 10,这是它的 基值。 例如,如果您将 345 向 左 移动 一位,您将得到 34,即 345/10。任何基值都具有相同的属性。由于 右移 运算符使用二进制数字,因此结果与除以 2 的幂相同。 示例 输出 20 >> 2 = 5 工作机制
结论在本文中,您了解了位运算符是什么,它们与 逻辑运算符 有何不同,以及它们在 C++ 中的作用。当正确使用时,位运算 可以帮助您节省大量时间。位操作技术的一些最流行的应用包括
下一主题C++ 中有多少个指示器 |
在本文中,您将学习 C++ 中的 std::nullopt 函数及其示例。它最初包含在 C++17 标准中。std::nullopt 是 C++ 中的一个常量,主要与 std::optional 结合使用,以表示值的缺失。以下是...
阅读 4 分钟
计算器是一种便携式设备,可帮助我们在日常生活中执行简单的数学计算,如加法、减法、除法、乘法等。一些科学计算器用于更轻松地执行复杂计算,如平方根、函数、指数运算、对数、三角函数……
5 分钟阅读
C++ 中的阶乘程序:n 的阶乘是所有正的递减整数的乘积。n 的阶乘用 n! 表示。例如:4! = 4*3*2*1 = 24 6! = 6*5*4*3*2*1 = 720 在这里,4! 读作“4 阶乘”,也称为“4...
阅读 2 分钟
在本文中,我们将讨论 C++ 中用于竞争性编程的 10 个最常用的内置函数。C++ 内置函数介绍 C++ 中的集成功能通常称为通用库功能或通过 C++ 标准模板库 (STL) 提供的功能。这些功能涵盖了广泛的...
阅读9分钟
Edmonds-Karp 算法是查找流网络中最大流的一种强大而有效的方法。流网络是一个有向图,其中每条边都有一个容量,表示其可承载的最大流量。该算法建立在 Ford-Fulkerson 方法的基础上,但...
11 分钟阅读
Kadane 算法简介 Kadane 算法是数据分析和计算机科学中用于确定给定数组内子数组的最大和的关键工具。数据科学、金融市场和计算机编程是该方法应用领域的几个例子...
阅读 10 分钟
简介:由于其动态大小和易用性,vector 是 C++ 中最常用的数据结构之一。它们通过允许您在单个连续内存块中存储和检索元素,为您提供灵活性和快速的元素检索。您将获得一个……
阅读 6 分钟
在本文中,我们将使用示例讨论 C++ 中的 std::chrono::time_point。std::chrono::time_point 类模板包含在 C++ 标准库的 <chrono> 头文件中。它用于处理涉及时间的计算,并表示一个特定的时间点。模板规范:Clock:这个时间点...
阅读 2 分钟
C++ 模板与 Java 泛型 在开发大型项目时,我们需要代码能够与提供给它的任何类型的数据兼容。这就是您编写的代码与其他代码区分开来的地方。我们在这里的意思是,您编写的代码应该...
阅读 3 分钟
在本文中,您将学习使用其示例。使用确定性有限自动机 (DFA) 检查可除性 使用确定性有限自动机 (DFA) 进行除法是一种可以有效地在硬件中实现整数除法的技术。基本思想是构建一个识别代表...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India