Способ представления некоторого «байта» заданным целым числом

Учитывая целое число в Java, есть ли простой способ представить его в двоичном виде в виде массива boolean?

int input = 12;

return {True, True, False, False};

А как быть, например, если у вас уже есть заданная длина списка? Как бы вы заставили его вернуть список с заданной длиной?

int input = 15; 

return {False, False, True, True, True, True};

Я пытался сделать указатель, который сбрасывался бы каждые два раза, но я знаю, что должно быть более простое решение, включающее просто использование оператора %.

Это привело к очень длительной задержке, закончившейся тайм-аутом.

Вы должны показать нам свой код, «указатель, который будет сбрасываться каждые два раза», на самом деле не имеет для меня особого смысла. Массив логических значений (именно то, что он говорит в вашем описании) объявлен как boolean[] <name>;

markspace 10.11.2022 16:27

Вместо % вам, скорее всего, понадобятся побитовые операторы & и >> для чтения упакованного int. Вы также можете использовать | и << для упаковки int из списка логических значений.

Rogue 10.11.2022 16:28

Звучит как вопрос XY Опишите вместо этого свою цель

g00se 10.11.2022 16:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете попробовать использовать 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 бит.

Joop Eggen 10.11.2022 16:36

@JoopEggen действительно, нам просто нужно знать, что new BitSet(42) не создает BitSet эквивалент числа 42.

Rob Spoor 10.11.2022 19:44

Что такое "какой-то байт"? Если вам нужен двоичный файл, я получил это из Интернета:

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

Другие вопросы по теме