如果我有输入,比如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处。
答案 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;它有效,但我不确定这是你需要的。