Разница в выводе на Java и других языках в генерации подпоследовательностей

Обновление: у меня вопрос, зачем нам нужен BigInteger в Java. Почему мы не можем решить вопрос непосредственно на псевдокоде, поскольку он работает на любом другом языке.

Это псевдокод для генерации подпоследовательностей массива.

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();
}

-2

Решение

Это оскорбительная строка кода:

if ((i & (1<<j)) == 1 )

Это не то же самое, что if (counter & (1<<j)) в C — в C целое число эквивалентно «истинному» условию, если его значение не ноль.

Чтобы исправить это, вы должны написать:

if ((i & (1<<j)) != 0)

После этого изменения вы получите то, что ожидали.

1

Другие решения

РЕДАКТИРОВАТЬ: Я прочитал вопрос немного неправильно.

Код без BigInteger имеет проблему:

if ((i & (1<<j)) == 1 )

В сдвиге вы сдвигаетесь на j. Это верно только в том случае, если j = 0 и у меня установлен первый бит.

Предположим, у нас есть:

i=5
j=2

Затем мы выполняем битовое смещение и имеем следующие двоичные представления:

i = 0101
j = 0100

После операции И мы имеем:

0100

Что явно не удовлетворяет условию.

Если вы измените его на:

if ((i & (1<<j)) > 0 )

Это работает, потому что ответ> 0, если конкретный бит, определенный 1 << J установлен.

РЕДАКТИРОВАТЬ: Удален оригинальный ответ, который не ответил на вопрос.

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
0
По вопросам рекламы [email protected]