这是为了防止其他人正在学习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包,而只是用%b%格式化rune。
var r rune
fmt.Printf("input: %b ", r)有更好的方法吗?
谢谢
发布于 2015-02-22 15:14:09
标准库支持
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的别名,这两个类型是一个且相同的类型(您可以用2个名称引用它)。
手工操作(“简单但天真”):
如果您想要“手动”执行,有一个比原来更简单的解决方案。您可以用r & 0x01 == 0测试最低位,用r >>= 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:])
}https://stackoverflow.com/questions/28659193
复制相似问题