Учитывая целое число в Java, есть ли простой способ представить его в двоичном виде в виде массива boolean
?
int input = 12;
return {True, True, False, False};
А как быть, например, если у вас уже есть заданная длина списка? Как бы вы заставили его вернуть список с заданной длиной?
int input = 15;
return {False, False, True, True, True, True};
Я пытался сделать указатель, который сбрасывался бы каждые два раза, но я знаю, что должно быть более простое решение, включающее просто использование оператора %
.
Это привело к очень длительной задержке, закончившейся тайм-аутом.
Вместо %
вам, скорее всего, понадобятся побитовые операторы &
и >>
для чтения упакованного int. Вы также можете использовать |
и <<
для упаковки int из списка логических значений.
Звучит как вопрос XY Опишите вместо этого свою цель
Вы можете попробовать использовать BitSet:
BitSet bitSet = BitSet.valueOf(new long[] { 12});
Порядок противоположен вашему примеру: индекс 0 является наименьшим значением. Например, при использовании 12 BitSet
имеет строковое представление {2, 3}
, что означает, что биты 2 и 3 установлены, а при использовании 15 это {0, 1, 2, 3}
.
Идеально, bitSet.contains(2) && bitSet.contains(3)
как 12 = 2² + 2³. И можно сделать запрошенное new BitSet(42)
для 42 бит.
@JoopEggen действительно, нам просто нужно знать, что new BitSet(42)
не создает BitSet
эквивалент числа 42.
Что такое "какой-то байт"? Если вам нужен двоичный файл, я получил это из Интернета:
import java.util.*;
import java.math.*;
class GFG {
public static BigInteger binaryConv(BigInteger n)
{
if (n.compareTo(BigInteger.valueOf(1)) == 0) {
return BigInteger.valueOf(1);
}
return ((binaryConv(n.divide(BigInteger.valueOf(2))).multiply(BigInteger.valueOf(10))).add(n.mod(BigInteger.valueOf(2))));
}
public static void main(String[] args)
{
BigInteger N = new BigInteger("9876543210987543210");
System.out.println(binaryConv(N));
}
}
Вывод:
1000100100010000100001111011100011100011101101010101101010101010
Если это не поможет, я чувствую, что вам нужно переформулировать свой вопрос.
P.S. В Java нет указателей. Теоретически вы могли бы сделать один, но не делайте этого; их нет по какой-то причине.
Учитывая целое число в Java, есть ли простой способ представить его в двоичном виде в виде массива логических значений?
Interger
класс предоставляет статический метод Integer.asBinaryString(i), который возвращает «строковое представление целочисленного аргумента в виде целого числа без знака по основанию 2».
Обратите внимание, что возвращаемая строка не будет содержать ведущих нулей (судя по первому примеру, это соответствует нужному вам поведению).
Кроме того, ту же строку можно получить, используя Integer.toString(i,2)
, которая ожидает целое число и основание.
Вот как такую строку можно преобразовать в массив boolean
:
public static boolean[] toBooleanArray(int num) {
String binaryStr = Integer.toBinaryString(num);
boolean[] res = new boolean[binaryStr.length()];
for (int i = 0; i < res.length; i++)
res[i] = binaryStr.charAt(i) == '1';
return res;
}
Или, если вы согласны с массивом типа-оболочки Boolean[]
, его можно сгенерировать в одном выражении с использованием Stream API (поскольку ввод представляет собой целочисленный массив, который будет содержать не более 31 элемента, поэтому не будет большой разницы, этот массив необходим только для одноразового использования, и метод не предназначен для очень частого использования):
public static Boolean[] toBooleanArray(int num) {
return Integer.toBinaryString(num).chars()
.map(Character::getNumericValue)
.mapToObj(i -> i == 1)
.toArray(Boolean[]::new); // or toList() to obtain the result as list
}
main()
public static void main(String[] args) {
System.out.println(Arrays.toString(toBooleanArray(9)));
System.out.println(Arrays.toString(toBooleanArray(12)));
System.out.println(Arrays.toString(toBooleanArray(15)));
}
Вывод:
[true, false, false, true] // 9 - 1001
[true, true, false, false] // 12 - 1100
[true, true, true, true] // 15 - 1111
Вы должны показать нам свой код, «указатель, который будет сбрасываться каждые два раза», на самом деле не имеет для меня особого смысла. Массив логических значений (именно то, что он говорит в вашем описании) объявлен как
boolean[] <name>;