【问题标题】:Given a number (bit sequence) and a bit index, how do I find the next highest order bit?给定一个数字(位序列)和一个位索引,我如何找到下一个最高位?
【发布时间】:2016-11-29 09:12:09
【问题描述】:

如果我有一个输入,比如 51 (00110011) 和一个表示位索引的索引 i(例如 i = 0 -> 1,i = 2 -> 0),我如何找到像这样的 2 的幂例子。抱歉,我不擅长数学符号,但我可以提供示例输入和输出。

示例:如果给定 51 和索引 1 (00110011),我希望函数返回 00010000 = 16。

此外,如果给定 173 和索引 2 (10101101),则函数必须返回 00001000 = 8。

我正在寻找一种解决方案,它最好根据数字的大小使用位操作并且不使用循环。

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

这是我能做的很少的事情

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

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

编辑 2 我让用户选择一周中的几天并将这些日子存储在一个数字中。给定一天,我想找到用户选择的第二天。我可以通过将数字转换为布尔数组来轻松做到这一点,但我想看看是否还有其他聪明的解决方案。如果它太像“家庭作业”,我深表歉意。

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

【问题讨论】:

  • 你的尝试在哪里?这不是家庭作业解决服务。
  • 这不是家庭作业。我正在编写一个将用户选择存储为数字的程序。我想在这里挑战自己。
  • 那么请发布您解决此挑战的尝试,以便我们帮助您了解错误或遗漏的地方
  • 我将发布我工作和发现的一些小东西。我的大部分工作都在我面前的草稿纸上。等等……
  • 了解作业与您显示的代码无关。总是显示出来。

标签: java binary bit-manipulation bitwise-operators


【解决方案1】:

还有一种非循环方式。

有一些简单的技巧可以用最低设置位来做事情,例如将其设置为零或隔离它。在这种情况下,我们将其设置为零:

int x = days & (days - 1);

这是可行的,因为减一将通过尾随的零借入,直到它到达最低设置位,它会重置,然后借用停止。

如果我们只需要隔离x 中的最低设置位,也有一个简单的技巧:

int mask = x & -x;

这是可行的,因为写入-x 的另一种方法是~x + 1,这清楚地表明它将翻转“高位”,但直到并包括x 中的最低设置位的部分仍然是相同(它被翻转了,但随后 +1 将其全部翻转)。

在某些时候,我们可能还需要获取该位的索引。 Java有Integer.numberOfTrailingZeros,它有一个Java实现,它比循环和逐个计数那些零更聪明,有些平台可以通过本机指令实现(HotSpot可以做到这一点,但当然不一定每个每个平台上的 JVM 都可以或将会做到)。

无论如何:

int pos = Integer.numberOfTrailingZeros(x); // note that we can use x here

【讨论】:

  • 1000 感谢您指出 Integer.numberOfTrailingZeros 简单方法。
【解决方案2】:

无论如何,您都必须使用循环。对于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
    }
}

这有帮助吗?我用你的案例对其进行了测试,它可以工作,但我不确定这是你需要的。

【讨论】:

  • 嘿,谢谢你成功了!我不确定是否有一种简单的方法可以在不循环的情况下做到这一点......无论如何,干杯伙伴!
猜你喜欢
  • 2018-08-11
  • 2011-01-20
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多