位于A和B之间的所有自然数中的位和(包括在内)

时间:2015-07-26 06:55:40

标签: java algorithm bit-manipulation

我在竞争问题网站上遇到过这个问题。 这是问题所在: -

问题陈述

您将获得两个整数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,但在那之后,循环中的程序是模糊的。如果你能搞清楚,请告诉我。

2 个答案:

答案 0 :(得分:3)

res = res | (1 << i);

循环的每次迭代测试两个数字中最左边的32-i位(代码中的A和B,或lr)是否彼此相等。如果是,则对于包含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;
}