首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go:将rune ( string )转换为二进制的字符串表示形式

Go:将rune ( string )转换为二进制的字符串表示形式
EN

Stack Overflow用户
提问于 2015-02-22 14:51:28
回答 1查看 4.6K关注 0票数 1

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

长话短说,我一直在看标准库,却找不到正确的电话。因此,我从以下几个方面开始:

代码语言:javascript
复制
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包,而只是用%b%格式化rune

代码语言:javascript
复制
var r rune
fmt.Printf("input: %b ", r)

有更好的方法吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-22 15:14:09

标准库支持

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

代码语言:javascript
复制
s := fmt.Sprintf("%b", r)

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

代码语言:javascript
复制
s := strconv.FormatInt(int64(r), 2)

注意,在Go中,rune只是int32的别名,这两个类型是一个且相同的类型(您可以用2个名称引用它)。

手工操作(“简单但天真”):

如果您想要“手动”执行,有一个比原来更简单的解决方案。您可以用r & 0x01 == 0测试最低位,用r >>= 1移位所有位。只需对所有位进行“循环”,并根据位的不同追加"1""0"

注意,这只是为了演示,它在性能方面远远不能达到最佳效果(生成“冗余”strings):

代码语言:javascript
复制
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函数来追加二进制数字,只需设置生成结果的数组的相应元素:

代码语言:javascript
复制
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:])
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28659193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档