【问题标题】:How do I convert a byte to a bool array in Go?如何在 Go 中将字节转换为布尔数组?
【发布时间】:2021-04-13 14:17:08
【问题描述】:

我想知道将字节转换为表示二进制数字的布尔数组的最佳方法是什么。

这将是输入:

var number byte = 170
// Equivalent binary would be: 10101010

输出将是一个布尔数组,表示数字的二进制等价物

binary := []bool{true, false, true, false, true, false, true, false}

我的计划是遍历这个数组。

【问题讨论】:

  • 您是否尝试过编写循环并提取各个位?
  • 你会怎么做?
  • 我忘了二进制只是一个以 2 为底的数字,你可以除以 2,谢谢!

标签: go binary


【解决方案1】:

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

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

工作示例:https://play.golang.org/p/v8NhlRvn-O6

【讨论】:

    【解决方案2】:

    将整数转换为其二进制表示的基本算法是重复测试整数是偶数还是奇数(分别对应于 0/“假”数字或 1/“真”),然后除以数字除以 2(使用整数除法,即将二进制表示右移一位),直到数字为 0。

    这给出了从右到左的各个位,如果您希望生成的切片包含从左到右的位,您需要将每个位添加到结果中(请参阅How to prepend int to slice) :

    func toBits (number byte) []bool {
        result := []bool{}
        for number > 0 {
            result = append([]bool{number % 2 == 1}, result...)
            number >>= 1
        }
        return result
    }
    

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

    【讨论】:

    • 请注意,当您知道预期有多少时,这将导致多次分配,并且不能保证 len 8 片。前导零将被完全省略 - 例如,0b00001111 将导致 []bool{true, true, true, true}
    猜你喜欢
    • 2022-06-12
    • 2014-08-10
    • 2016-11-27
    • 1970-01-01
    • 2020-02-05
    • 2016-01-28
    • 2012-03-02
    • 2014-10-11
    • 2017-03-30
    相关资源
    最近更新 更多