如何在Go中将字节转换为布尔数组?

如何在Go中将字节转换为布尔数组?,go,binary,Go,Binary,我想知道将字节转换成二进制数字的布尔数组的最佳方式是什么 这将是输入: 变量编号字节=170 //等价的二进制代码是:10101010 输出将是一个bool数组,表示该数字的二进制等价物 二进制:=[]bool{true,false,true,false,true,false,true,false} 我的计划是对这个数组进行迭代。您只需迭代位即可。请注意,要获得预期的输出,必须反向执行,因为预期的输出具有表示字节最高有效位的数组的第一个元素 var out [8]bool for i := 7;

我想知道将字节转换成二进制数字的布尔数组的最佳方式是什么

这将是输入:

变量编号字节=170 //等价的二进制代码是:10101010 输出将是一个bool数组,表示该数字的二进制等价物

二进制:=[]bool{true,false,true,false,true,false,true,false}
我的计划是对这个数组进行迭代。

您只需迭代位即可。请注意,要获得预期的输出,必须反向执行,因为预期的输出具有表示字节最高有效位的数组的第一个元素

var out [8]bool
for i := 7; i > 0; i-- {
    if in&(1<<i) > 0 {
        out[i] = true
    }
}

工作示例:

将整数转换为二进制表示的基本算法是重复测试该整数是否分别对应于0/假数字或1/真数字,并使用整数除法将该数字除以2,即将二进制表示向右移动一个位置,直到数字为0

这将给出从右到左的各个位,如果希望生成的切片包含从左到右的位,则需要将每个位前置到结果,请参见:


重复地预加一个切片会导致多个复制操作和重新分配。更有效的解决方案是预先分配具有目标大小的切片,并从右向左填充。这需要使用对数计算数字的大小,或者只指定大小。

您是否尝试过编写循环并提取单个位?您会怎么做?我忘了二进制只是一个以2为基数的数字,您可以直接除以2,谢谢!请注意,当您知道需要分配多少时,这将导致多个分配,并且不能保证len 8切片。前导零将被完全省略-例如,0b00001111将导致[]bool{true,true,true,true}。
func toBits (number byte) []bool {
    result := []bool{}
    for number > 0 {
        result = append([]bool{number % 2 == 1}, result...)
        number >>= 1
    }
    return result
}