【问题标题】:Go: convert rune (string) to string representation of the binaryGo:将 rune(字符串)转换为二进制的字符串表示形式
【发布时间】:2015-04-23 21:58:12
【问题描述】:

这只是为了以防其他人正在学习 Golang,并且想知道如何从字符串转换为二进制字符串表示。

长话短说,我一直在查看标准库,但找不到正确的调用。所以我从类似于以下内容开始:

func RuneToBinary(r rune) string {
    var buf bytes.Buffer
    b := []int64{128, 64, 32, 16, 8, 4, 2, 1}
    v := int64(r)
    for i := 0; i < len(b); i++ {
        t := v-b[i]
        if t >= 0 {
           fmt.Fprintf(&buf, "1")
           v = t
        } else {
           fmt.Fprintf(&buf, "0")
        }
    }

    return buf.String()
}

这一切都很好,但经过几天的环顾后,我发现我应该使用fmt 包,而只需将rune 格式化为%b%:

var r rune
fmt.Printf("input: %b ", r)

有没有更好的方法来做到这一点?

谢谢

【问题讨论】:

    标签: string go binary type-conversion


    【解决方案1】:

    标准库支持

    fmt.Printf("%b", r) - 这个解决方案已经非常紧凑并且易于编写和理解。如果你需要string的结果,你可以使用模拟Sprintf()函数:

    s := fmt.Sprintf("%b", r)
    

    您还可以使用strconv.FormatInt() 函数,该函数采用int64 类型的数字(因此您首先必须转换您的rune)和一个可以传递2 的基数以获得二进制表示的结果:

    s := strconv.FormatInt(int64(r), 2)
    

    请注意,在 Go 中rune 只是int32 的别名,这两种类型是一回事(只是你可以用两个名称来引用它)。

    手动操作(“简单但幼稚”):

    如果您想“手动”执行此操作,有一个比您原来的解决方案简单得多的解决方案。您可以使用r &amp; 0x01 == 0 测试最低位并使用r &gt;&gt;= 1 移动所有位。只需“循环”所有位并根据位附加"1" 或"0":

    请注意,这只是为了演示,它远非最佳性能(生成“冗余”strings):

    func RuneToBin(r rune) (s string) {
        if r == 0 {
            return "0"
        }
        for digits := []string{"0", "1"}; r > 0; r >>= 1 {
            s = digits[r&1] + s
        }
        return
    }
    

    注意:该函数不处理负数。如果您还想处理负数,您可以先检查它并继续处理它的正值,并以减号'-' 开始返回值。这也适用于下面的其他手动解决方案。

    手动性能方面的解决方案:

    对于快速解决方案,我们不应该附加字符串。由于 Go 中的字符串只是使用 UTF-8 编码的字节切片,因此附加一个数字只是附加符文 '0' 或 '1' 的字节值,这只是一个字节(不是多字节)。所以我们可以分配一个足够大的缓冲区/数组(rune 是 32 位,所以最多 32 个二进制数字),并向后填充它,这样我们甚至不必在最后反转它。并在最后返回转换为string 的数组的已使用部分。请注意,我什至没有调用内置的 append 函数来附加二进制数字,我只是设置了构建结果的数组的相应元素:

    func RuneToBinFast(r rune) string {
        if r == 0 {
            return "0"
        }
        b, i := [32]byte{}, 31
        for ; r > 0; r, i = r>>1, i-1 {
            if r&1 == 0 {
                b[i] = '0'
            } else {
                b[i] = '1'
            }
        }
        return string(b[i+1:])
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 2021-02-12
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      相关资源
      最近更新 更多