有没有人知道Go中是否有任何内置功能可以将任何一种数字类型转换为其二进制数字形式。
例如,如果123
是输入,则字符串"1111011"
将是输出。
有没有人知道Go中是否有任何内置功能可以将任何一种数字类型转换为其二进制数字形式。
例如,如果123
是输入,则字符串"1111011"
将是输出。
Answers:
该strconv
包有FormatInt
,它接受的int64
,并允许您指定的基地。
n := int64(123)
fmt.Println(strconv.FormatInt(n, 2)) // 1111011
演示: http : //play.golang.org/p/leGVAELMhv
http://golang.org/pkg/strconv/#FormatInt
func FormatInt(i int64, base int) string
FormatInt返回给定基数i的字符串表示形式,表示2 <= base <=36。结果使用小写字母'a'到'z'表示数字值> = 10。
fmt.Println(strconv.FormatInt(n, 2))
是-11
,但是我想要二进制补码格式。
i, err := strconv.ParseInt("1101", 2, 64)
另请参见fmt软件包:
n := int64(123)
fmt.Printf("%b", n) // 1111011
s := fmt.Sprintf("%b", 123)
这段代码适用于大整数*big.Int
:
x := big.NewInt(123)
s := fmt.Sprintf("%b", x)
// s == "1111011"
因为*big.Int
实现了fmt.Formatter
接口。
package main
import . "fmt"
func main(){
Printf("%d == %08b\n",0,0)
Printf("%d == %08b\n",1,1)
Printf("%d == %08b\n",2,2)
Printf("%d == %08b\n",3,3)
Printf("%d == %08b\n",4,4)
Printf("%d == %08b\n",5,5)
}
结果是:
0 == 00000000
1 == 00000001
2 == 00000010
3 == 00000011
4 == 00000100
5 == 00000101
以@Mark提供的答案为基础
尽管OP询问了如何打印整数,但我经常想看的是64位以上的数据,而不会感到困惑:
/* --- Credit to Dave C in the comments --- */
package main
import (
"bytes"
"fmt"
)
func main() {
fmt.Printf("<%s>\n", fmtBits([]byte{0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0x0D, 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0x0D}))
// OUTPUT:
// <11011110 10101101 10111110 11101111 11110000 00001101 11011110 10101101 10111110 11101111 11110000 00001101>
}
func fmtBits(data []byte) []byte {
var buf bytes.Buffer
for _, b := range data {
fmt.Fprintf(&buf, "%08b ", b)
}
buf.Truncate(buf.Len() - 1) // To remove extra space
return buf.Bytes()
}
在play.golang.org中看到此代码
[]byte
。一再追加到string
这样是低效的,更好的是使用像一个bytes.Buffer
(或者如果只是它没有前导零,只使用strconv.AppendInt
了普通的[]byte
)。strings.TrimSpace
仅仅为了处理单个额外空间而调用每次迭代是非常低效的。例如,在1kB输入上,诸如play.golang.org/p/ifobZWv_du之类的内容快大约50倍,并占用大约1/50的内存。
接受答案的另一种方法是简单地
s := fmt.Sprintf("%b", 123)
fmt.Println(s) // 1111011
对于更丰富的表示形式,您可以使用该unsafe
软件包(强烈建议不要使用)
a := int64(123)
byteSliceRev := *(*[8]byte)(unsafe.Pointer(&a))
byteSlice := make([]byte, 8)
for i := 0; i < 8; i++ {
byteSlice[i] = byteSliceRev[7 - i]
}
fmt.Printf("%b\n", byteSlice)
这也适用于负整数。
必须使用不安全的指针以二进制格式正确表示负数。
package main
import (
"fmt"
"strconv"
"unsafe"
)
func bInt(n int64) string {
return strconv.FormatUint(*(*uint64)(unsafe.Pointer(&n)), 2)
}
func main() {
fmt.Println(bInt(-1))
}