正整数最低数求解:算法推导、代码实现与注意事项
要找到A的最低数,需要提取A的二进制表示中从最低位开始连续的1组成的二进制数。 例如: - A=26,二进制11010,最低位开始是0,接着是1,所以连续的1是10(二进制),十进制是2。 - A=88,二进制1011000,最低位开始是三个0,接着是三个1,所以连续的1是1000(二进制),十进制是8。 算法思路: 1. 找到A的二进制中最低位的1的位置(即A & -A,得到最低位1对应的值)。 2. 如果A的最低几位是连续的1,那么最低数就是这些连续的1组成的二进制数。 3. 实际上,最低数就是A的二进制表示中从最低位开始连续的1所对应的二进制数。 可以这样计算: - 令 x = A & -A(得到最低位的1单独的值,比如 26 & -26 = 2)。 - 然后令 y = A + x(这样会进位,使得原来连续的1变成0,并产生一个进位)。 - 最低数 = (A & ~y) / x * 2 ? 更简单的方法: 直接找到A的二进制中从最低位开始连续的1,等价于 (A ^ (A + (A & -A))) / (A & -A) >> 1 ? 其实更简单: 最低数 = (A & -A) * 2 ? 不对,因为连续的1可能不止一位。 实际上,最低数 = (A ^ (A - 1)) & A ? 测试一下: A=26: A-1=25(11001), A^(A-1)=00011(3), 与A=11010得00010(2),正确。 A=88: A-1=87(1010111), A^(A-1)=0001111(15), 与A=1011000得0001000(8),正确。 所以公式是: lowest_number = A & (A ^ (A - 1)) 等价于 A & (~A + 1) & A ? 其实就是 A & -A ? 不对,A&-A只得到最低一位1,但这里要得到连续的1。 仔细看: A ^ (A-1) 得到的是从最低位开始到第一个0位(包括)都是1,其余是0。 例如A=26(11010), A-1=25(11001), 异或得到00011(二进制),即最后两位不同,得到3。 再与A相与,得到00010(二进制),即2。 所以公式是: result = A & (A ^ (A - 1)) 代码实现(C++): ```cpp #include <iostream> using namespace std; int main() { int A; while (cin >> A && A != 0) { int lowest = A & (A ^ (A - 1)); cout << lowest << endl; } return 0; } ``` 测试样例: 输入: 26 88 0 输出: 2 8 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: - 注意A=0时的输入终止条件,避免对0进行计算。 - 使用位运算时确保操作数类型一致,避免符号位干扰。 - 多组测试数据要持续读取直到结束标志,不要提前退出循环。 ######[AI写代码神器 | 775点数解答 | 2026-01-23 19:40:10]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)345
- 解决 consoleapplication40.cpp 中 buildtree 模板参数推导失败错误的方法(字节豆包 | 138点数解答 | 2024-11-10 23:42:06)240
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)313
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)464
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)356
- Java:设计圆类与圆柱体类并计算属性及体积表面积(字节豆包 | 470点数解答 | 2024-10-20 10:03:11)183
- Java 实现矩形与长方体类,精准计算底面积与体积(字节豆包 | 319点数解答 | 2024-10-20 10:25:46)287
- Java 实现矩形与长方体类,轻松计算底面积和体积(字节豆包 | 308点数解答 | 2024-10-20 10:34:27)272
- Java 实现矩形与长方体类:计算底面积与体积的完整代码示例(字节豆包 | 306点数解答 | 2024-10-20 18:34:47)272
- 云南 8 日摄影行程表 HTML 代码优化与逻辑注意点揭秘(字节豆包 | 217点数解答 | 2025-03-09 13:19:03)264
- Python切片操作巧解经典算法:二维数组90°旋转(阿里通义 | 205点数解答 | 2023-10-31 11:05:29)335
- 揭秘iOS开发:常用算法大集合,提升应用性能与体验!(阿里通义 | 246点数解答 | 2023-11-08 00:43:08)289