C++ 中翻转数字的开关位(除首位和末位外)

2025 年 3 月 25 日 | 阅读 3 分钟

在本文中,我们将介绍如何在 C++ 中查找一个数除了第一位和最后一位的 翻转位

给定一个数,目标是翻转除了第一位和最后一位之外的所有位。

示例

输入 11

输出 13

二进制表示:- 1 0 1 1

翻转第一位和最后一位后:1 1 0 1

现在,创建一组包含中间位的数字。我们必须将所有中心位设置为 1,同时保持角位不变。

方法 1:使用异或 (XOR)

解决方案是生成数和原始数的 异或。值得注意的是,将 1 与一个数结合会翻转这个数。

示例 1

让我们举一个例子,在 C++ 中使用异或查找一个数除了第一位和最后一位的 翻转位

输出

10

方法 2:使用位掩码

为了解决这个问题,我们可以利用某个位与 1 的 异或 来翻转相关的位。因此,我们可以为 n 位 整数创建一个类型为 0111....11110 的位掩码,即一个除了第一位和最后一位之外所有位都设置为 1 的 n 位 数。因此,对于大于或等于 4 的数字,位掩码等于 2n - 2。

示例 2

让我们举一个例子,在 C++ 中使用位掩码查找一个数除了第一位和最后一位的 翻转位

输出

14

说明

  • 在此示例中,当值小于 4 时,函数返回输入数字。
  • 当值大于或等于 4 时,它根据给定值中设置的最高位计算位掩码,然后执行位异或操作以根据该掩码翻转位。
  • 例如,当数字是 8 时
  • 8 的二进制等效是 1000。
  • (1 (int)log2(8)) - 2 等于 1110。
  • 1000 与 1110 异或得到 0110 (二进制),这等价于十进制的 6。
  • 因此,togglemiddle(8) 返回值为 6。