给定一个数字范围,您需要查找该范围内所有数字的按位和。
例:
[5, 7]
5、6、7的按位与为4。
一旦了解了以下概念,解决方案就非常简单:
让我们举个小例子,试着理解。
我们将按位找到&范围4、5、6、7中的一个。
如您所见,如果所有位均为1,将返回1。
再次考虑范围8、9、10、11、12
这里的模式也一样。您会看到,除了最高有效位以外,所有其他位均为零。
一旦解决方案可以一点一点地做&操作。但这不是有效的。
而我们唯一获得1的情况是数字m和n相同。
因此,我们可以做的是,可以将两个数字右移1,直到两个数字都相同。我们还应该跟踪已进行了多少轮班。
然后,当两个数字都相同时,我们可以向左移执行右移的次数。因此,我们得出了解决方案。
C ++解决方案
#include<iostream> using namespace std; int range_bitwise_and(int m, int n) { int shift = 0; while (m != n) { shift++; m = m >> 1; n = n >> 1; } return m << shift; } int main() { int num_1 = 5; int num_2 = 7; cout<<"solution = "<<range_bitwise_and(num_1, num_2)<<endl; }
输出:
solution = 4
该网站上可用的教程列表:
C编程20+章 | C ++编程80+章 |
100多个编码问题 | 数据结构和算法85+章 |
系统设计20+章 | Shell脚本编写12章 |
4g LTE 60+章节 | 最常见的编码问题 |
5G NR 50+章 | Linux系统编程20+章 |