生成子序列时Java和其他语言的输出差异

时间:2018-06-05 07:12:03

标签: java c++ arrays subsequence

更新:我的问题是为什么我们需要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();
    }

3 个答案:

答案 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=0b0110j=1=0b0001

1<<j == 2 == 0b0010
i & (1<<j) == 0b0110 & 0b0010 == 0b0010 == 2