给定一个数字(位序列)和位索引,如何找到下一个最高位的位?

时间:2016-07-25 21:26:43

标签: java binary bit-manipulation bitwise-operators

如果我有输入,比如51(00110011)和索引i表示比特索引(例如i = 0 - > 1,i = 2 - > 0),如何找到2的幂像这些例子。对不起,我在数学符号方面表现不佳,但我可以提供样本输入和输出。

示例:如果给定51和索引1(001100 1 1),我想要一个函数返回00010000 = 16.

此外,如果给定173和索引2(10101 1 01),则该函数必须返回00001000 = 8.

我正在寻找一种使用位操作的解决方案,而不是基于数字大小的循环。

编辑:这不是家庭作业。我正在编写一个将用户选择存储为数字的程序。我试图在这里挑战自己。

这是我能做的很少的事情

    x--;
    for (int j = 0; j < 5; j++) {
        x |= x >> (int) Math.pow(2, i);
    }
    x++;
    return x;

这需要一个32位数字并返回下一个2的幂。我不确定这是否对我的问题有用。我试过看看是否有其他人发布了类似的东西,这就是我发现的东西,并认为它可能会影响到我想要做的事情。

编辑2 我让用户选择一周中的几天并将这些日期存储在一个数字中。有一天,我想找到用户选择的第二天。通过将数字转换为布尔数组,我可以很容易地做到这一点,但想知道是否还有其他聪明的解决方案。我道歉,如果它也是#34;家庭作业&#34;等。

我已经意识到如果我采用51(00110011)和索引1这样的数字,我可以通过除以2 ^ 1 = 001100来减去前两位。然后,我希望程序找到位置第1个(索引2)。然后它应该返回2 ^(2 + 2),因为它削减了2位,然后下一个逻辑1在索引2处。

2 个答案:

答案 0 :(得分:2)

也有非循环方式。

使用最低设置位执行操作有一些简单的技巧,例如将其设置为零或隔离它。在这种情况下,我们将其设置为零:

void

这是有效的,因为减去一个将借用尾随零,直到它达到最低设置位,然后重置,然后借用停止。

如果我们只需要隔离int x = days & (days - 1); 中现在最低的设置位,那么这也是一个简单的技巧:

x

这是有效的,因为写int mask = x & -x; 的另一种方法是-x,这清楚地表明它将翻转“高位”,但部分最多并包括{{1}中的最低设置位{1}}保持不变(它被翻转,但然后+1通过它将它全部翻转回来)。

在某些时候,我们也需要获得该位的索引。 Java有~x + 1,它有一个Java实现,比循环和逐个计数这些零更聪明,有些平台可以通过本机指令实现(HotSpot可以做到这一点,但当然不是必然每个平台上的每个JVM都可以或将要这样做。)

所以无论如何:

x

答案 1 :(得分:1)

无论如何你必须使用一个循环。对于java,对吗?代码:

public class Test {
    public static void main(String[] args) {
        System.out.println(yourHomework(51,1));
        System.out.println(yourHomework(173,2));
    }
    public static int yourHomework(int number, int index) { // LOL!! Joke!
            for (int i = index + 1; i < 32; i++) {
                if ((number | (1 << i)) == number)
                     return 1 << i;
            }
            return 0; // Or the value it must return if there is not answer
    }
}

这有帮助吗?我用你的案例测试它&amp;它有效,但我不确定这是你需要的。