Извлечь биты в int-фрагмент из байтового фрагмента

У меня есть следующий фрагмент байта, из которого мне нужно извлечь биты и поместить их в [] int, поскольку я намерен получить отдельные значения битов позже. Мне сложно понять, как это сделать.

ниже мой код

data := []byte{3 255}//binary representation is for 3 and 255 is 00000011 11111111

мне нужен кусочек бит -> [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1]

Что я пробовал

  • Я попытался преобразовать байтовый фрагмент в Uint16 с помощью BigEndian, а затем попытался использовать strconv.FormatUint, но это не удалось с ошибкой panic: runtime error: index out of range
  • Видел много примеров, в которых простое битовое представление числа с использованием функции fmt.Printf, но это бесполезно для меня, так как мне нужен int-срез для дальнейшего доступа к битовому значению.

Нужно ли мне здесь использовать операторы битового сдвига? Любая помощь будет оценена.

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
4
0
1 546
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Один из способов - перебрать байты и использовать второй цикл для побитового сдвига байтовых значений и проверки битов с помощью битовой маски. И добавляем результат в выходной срез.

Вот его реализация:

func bits(bs []byte) []int {
    r := make([]int, len(bs)*8)
    for i, b := range bs {
        for j := 0; j < 8; j++ {
            r[i*8+j] = int(b >> uint(7-j) & 0x01)
        }
    }
    return r
}

Тестируем это:

fmt.Println(bits([]byte{3, 255}))

Вывод (попробуйте на Перейти на игровую площадку):

[0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]

Использование пакета bits обеспечивает довольно простое решение.

func bitsToBits(data []byte) (st []int) {
    st = make([]int, len(data)*8) // Performance x 2 as no append occurs.
    for i, d := range data {
        for j := 0; j < 8; j++ {
            if bits.LeadingZeros8(d) == 0 {
                // No leading 0 means that it is a 1
                st[i*8+j] = 1
            } else {
                st[i*8+j] = 0
            }
            d = d << 1
        }
    }
    return
}

Производительность сопоставима с аналогичные решения.

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