有没有人知道Go中是否有任何内置功能可以从任何一种数字类型转换为二进制数字形式。
例如,如果123
是输入,则字符串"1111011"
将是输出。
strconv
包有FormatInt
,它接受int64
并允许你指定基地。
n := int64(123)
fmt.Println(strconv.FormatInt(n, 2)) // 1111011
但是:ぁzxswい
http://play.golang.org/p/leGVAELMhv
http://golang.org/pkg/strconv/#FormatInt
FormatInt返回给定基数中i的字符串表示形式,对于2 <= base <= 36.结果使用小写字母'a'到'z'表示数字值> = 10。
另见func FormatInt(i int64, base int) string
包:
fmt
此代码适用于大整数n := int64(123)
fmt.Printf("%b", n) // 1111011
:
*big.Int
因为x := big.NewInt(123)
s := fmt.Sprintf("%b", x)
// s == "1111011"
实现了*big.Int
接口。
取自fmt.Formatter
基于@Mark提供的答案
尽管OP询问如何打印整数,但我经常想要查看超过64位的数据,而我的眼睛却难以置信:
https://stackoverflow.com/a/23317788/871134
/* --- 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()
}
必须使用不安全指针以二进制格式正确表示负数。
see this code in play.golang.org
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))
}