更新:我的问题是为什么我们需要Java中的BigInteger。为什么我们不能直接在伪代码上解决问题,因为它在所有其他语言中都有效。
这是用于生成数组子序列的伪代码。
int[] arr = {1,2,3} ;
int opsize = 2^size_of_array ;
for (int counter = 1; counter < opsize; counter++)
{
for (int j = 0; j < n; j++)
{
if (counter & (1<<j))
print(arr[j] + " ");
}
print new line ;
}
它适用于除Java之外的所有语言。在其他所有语言中,输出都是
1
2
1 2
3
1 3
2 3
1 2 3
在Java中,代码是
class Solution
{
public static void main (String[] args) throws java.lang.Exception
{
int[] arr = {1,2,3};
int n = arr.length ; ;
int res = (int) Math.pow(2,n);
for(int i = 1 ; i < res ; i++)
{
for(int j = 0 ; j < n ; j++)
if ((i & (1<<j)) == 1 )
System.out.print(arr[j] + " ");
System.out.println();
}
}
}
在Java中,相同代码的输出是
1
1
1
1
在Java中,我们需要BigInteger来解决相同的问题
int opsize = (int)Math.pow(2, n);
for (int counter = 1; counter < opsize; counter++)
{
for (int j = 0; j < n; j++)
{
if (BigInteger.valueOf(counter).testBit(j))
System.out.print(arr[j]+" ");
}
System.out.println();
}
答案 0 :(得分:1)
这是令人讨厌的代码行:
if ((i & (1<<j)) == 1 )
这与C中的if (counter & (1<<j))
不同 - 在C中,如果整数等于非零,则整数等同于“真”条件。
要纠正这个问题,你应该写:
if ((i & (1<<j)) != 0)
在更改之后,输出就是您所期望的。
答案 1 :(得分:0)
没有BigInteger的代码存在问题:
if ((i & (1<<j)) == 1 )
在bitshift中,你移动j。仅当j = 0并且i设置了第一位时才会出现这种情况。
假设我们有:
i=5
j=2
然后我们对bitshift进行以下二进制表示:
i = 0101
j = 0100
在AND操作之后我们有:
0100
这显然不符合条件。
如果您将其更改为:
if ((i & (1<<j)) > 0 )
它有效,因为答案是&gt;如果特定位由1&lt;&lt; j已设定。
编辑:删除了未回答问题的原始答案。
答案 2 :(得分:0)
你的病情很糟糕:
(i & (1<<j)) == 1
应该是
(i & (1<<j)) != 0
例如i=6=0b0110
和j=1=0b0001
:
1<<j == 2 == 0b0010
i & (1<<j) == 0b0110 & 0b0010 == 0b0010 == 2