c++ - 仅使用按位运算反转(翻转)数字的最后 n 位
问题描述
给定一个二进制整数,如何在 c/c++ 中仅使用按位运算来反转(翻转)最后 n 位?
例如:
// flip last 2 bits
0110 -> 0101
0011 -> 0000
1000 -> 1011
解决方案
您可以使用翻转号码的最后 n 位
#define flipBits(n,b) ((n)^((1u<<(b))-1))
例如flipBits(0x32, 4)
将翻转最后 4 位,结果将是0x3d
这是有效的,因为如果您认为 XOR 是如何工作的
0 ^ 0 => 0
1 ^ 0 => 1
位不翻转
0 ^ 1 => 1
1 ^ 1 => 0
位被翻转
(1<<b)-1
这部分为您提供最后 n 位,例如,如果 b 为 4,1<<4
则为0b10000
,如果我们删除 1,我们将得到我们的掩码,0b1111
然后我们可以使用它与我们的数字进行异或以获得所需的输出。
适用于 C 和 C++
推荐阅读
- c# - 如何将两个数字相乘并得到每两个数字相乘的 SUM?
- d3.js - d3.js v5 桑基粒子
- task - 我应该使用 Task.Wait() 吗?
- android - 如果 AsyncTask 花费的时间太长,操作系统可以停止它吗?
- calendar - 使用谷歌日历管理N个组日历
- php - 关于REGEX提取文本之间的问题
- powershell - Powershell form.acceptbutton 多个动作
- c# - Unity:按下 UI 按钮时如何停止使用“Input.GetMouseButton(0)”?
- c++ - For 循环不会在 C++ Arduino 中停止
- c# - 在 mvc 应用程序中找不到资源 api