У меня есть следующий фрагмент байта, из которого мне нужно извлечь биты и поместить их в [] 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]
Что я пробовал
strconv.FormatUint, но это не удалось с ошибкой panic: runtime error: index out of rangefmt.Printf, но это бесполезно для меня, так как мне нужен int-срез для дальнейшего доступа к битовому значению.Нужно ли мне здесь использовать операторы битового сдвига? Любая помощь будет оценена.



Один из способов - перебрать байты и использовать второй цикл для побитового сдвига байтовых значений и проверки битов с помощью битовой маски. И добавляем результат в выходной срез.
Вот его реализация:
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
}
Производительность сопоставима с аналогичные решения.