Преобразуйте bool [] к байту []

Когда я просто разархивировал Gradle в папку, установил GRADLE_HOME и добавил его в свой путь, у меня были всевозможные проблемы с IntelliJ, не зная, что нужно восстановить. Некоторым помогло удаление выходного каталога IntelliJ .

Затем, однажды, обновили IDEA до:

IntelliJ IDEA 2019.1 (Ultimate Edition)
Build #IU-191.6183.87, built on March 27, 2019
JRE: 1.8.0_202-release-1483-b39 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.15.0-47-generic

Затем я установил Gradle, используя SDKMAN! в соответствии с инструкциями Gradle , и повторно импортировал проект в ИДЕЮ. Эта проблема и все другие мои проблемы со сборкой исчезли. Что из этого действительно решило мою проблему? Я не знаю.

9
задан huysentruitw 4 January 2016 в 17:57
поделиться

4 ответа

Вот два подхода, в зависимости от того, хотите ли Вы упаковать биты в байты или иметь столько же байтов сколько исходные биты:

    bool[] bools = { true, false, true, false, false, true, false, true,
                     true };

    // basic - same count
    byte[] arr1 = Array.ConvertAll(bools, b => b ? (byte)1 : (byte)0);

    // pack (in this case, using the first bool as the lsb - if you want
    // the first bool as the msb, reverse things ;-p)
    int bytes = bools.Length / 8;
    if ((bools.Length % 8) != 0) bytes++;
    byte[] arr2 = new byte[bytes];
    int bitIndex = 0, byteIndex = 0;
    for (int i = 0; i < bools.Length; i++)
    {
        if (bools[i])
        {
            arr2[byteIndex] |= (byte)(((byte)1) << bitIndex);
        }
        bitIndex++;
        if (bitIndex == 8)
        {
            bitIndex = 0;
            byteIndex++;
        }
    }
25
ответ дан 4 December 2019 в 07:24
поделиться

Можно использовать LINQ. Это не будет эффективно, но будет просто. Я предполагаю, что Вы хотите один байт на bool.

bool[] a = new bool[] { true, false, true, true, false, true };
byte[] b = (from x in a select x ? (byte)0x1 : (byte)0x0).ToArray();
3
ответ дан 4 December 2019 в 07:24
поделиться

Если Вы имеете какой-либо контроль над типом списка, попытайтесь сделать его Списком, который затем произведет байт [] на ToArray (). Если у Вас есть ArrayList, можно использовать:

(byte[])list.ToArray(typeof(byte));

Для получения Списка Вы могли создать один с Вашим неуказанным итератором списка как вход конструктору и затем произвести ToArray ()? Или скопируйте каждый объект, бросив к новому байту от bool?

Некоторая информация о том, какой список это, могла бы помочь.

0
ответ дан 4 December 2019 в 07:24
поделиться

Взгляните на класс BitConverter. В зависимости от точного характера Вашего требования это может решить Вашу проблему вполне аккуратно.

0
ответ дан 4 December 2019 в 07:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: