Обновление: у меня вопрос, зачем нам нужен 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();
}
Это оскорбительная строка кода:
if ((i & (1<<j)) == 1 )
Это не то же самое, что if (counter & (1<<j))
в C — в C целое число эквивалентно «истинному» условию, если его значение не ноль.
Чтобы исправить это, вы должны написать:
if ((i & (1<<j)) != 0)
После этого изменения вы получите то, что ожидали.
РЕДАКТИРОВАТЬ: Я прочитал вопрос немного неправильно.
Код без 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 установлен.
РЕДАКТИРОВАТЬ: Удален оригинальный ответ, который не ответил на вопрос.
Ваше состояние плохое:
(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