我在竞争问题网站上遇到过这个问题。 这是问题所在: -
问题陈述
您将获得两个整数A和B.您需要在A和B之间的所有自然数中计算按位AND(包括两者)。
修复编辑器中的代码,以便解决上述问题。您需要填写标有“~~填写此行”的缺失行。不要修改或插入任何其他行,否则即使代码正确,也会得到错误的答案。
输入格式
输入的第一行包含T,即要遵循的测试用例数。换行符中的每个测试用例包含由单个空格分隔的A和B.
约束:
import java.math.BigInteger;
import java.util.Scanner;
public class Magic4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
for (int t = 0; t < T; t++) {
long l = scanner.nextLong();
long r = scanner.nextLong();
long res = 0;
for (long i = 0; i < 32; i++) {// I can make out that we are dealing with 32 bit numbers hence we are setting the condition as i < 32, but after that the proceedings in the loop are vague.
if ((r - l + 1 == 1))
if(l%2==1)
~~Fill this line~~
l >>= 1; r >>= 1;
}
System.out.println(res);
}
scanner.close();
}
}
输出格式 每个测试用例输出一行,并带有所需的按位AND。
示例输入
3
12 15
2 3
8 13
示例输出
12
2
8
以下是我们必须填写缺失行的代码:
append
问题我只是无法解决它,即使花了一些时间就填充正确的行。我可以知道我们正在处理32位数,因此我们将条件设置为i&lt; 32,但在那之后,循环中的程序是模糊的。如果你能搞清楚,请告诉我。
答案 0 :(得分:3)
res = res | (1 << i);
循环的每次迭代测试两个数字中最左边的32-i
位(代码中的A和B,或l
和r
)是否彼此相等。如果是,则对于包含1的A(或B)的每个32-i
位,A和B之间的所有数字的按位AND的结果必须包含1。
因此,如果r - l + 1 == 1
(即r == l)和l%2==1
,则结果的i
'位必须为1.
答案 1 :(得分:0)
优化代码(在Hackerrank上测试)
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int nTestCases;
unsigned int nStart, nEnd;
scanf("%d", &nTestCases);
while (nTestCases--)
{
scanf("%u %u", &nStart, &nEnd);
unsigned int nWalk = (nEnd - nStart);
unsigned int nMask = 1;
while (nWalk)
{
nWalk >>= 1;
nMask <<= 1;
}
nMask = nMask - 1;
printf("%u\n", (nStart & ~nMask & nEnd));
}
return 0;
}