88

有没有人知道Go中是否有任何内置功能可以将任何一种数字类型转换为其二进制数字形式。

例如,如果123是输入,则字符串"1111011"将是输出。

4

7 回答 7

127

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。对于 >= 10 的数字值,结果使用小写字母 'a' 到 'z'。

于 2012-12-14T00:21:43.797 回答
72

另请参阅fmt包:

n := int64(123)
fmt.Printf("%b", n)  // 1111011
于 2014-04-29T11:55:23.117 回答
10

此代码适用于大整数*big.Int

x := big.NewInt(123)
s := fmt.Sprintf("%b", x)
// s == "1111011"

因为*big.Int实现了fmt.Formatter接口。

取自https://stackoverflow.com/a/23317788/871134

于 2015-08-21T13:57:14.997 回答
10
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
于 2019-11-09T23:41:09.633 回答
3

基于@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 中查看此代码
于 2015-07-26T00:59:21.233 回答
2

接受答案的另一种方法是简单地做

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)

这也适用于负整数。

于 2020-07-26T22:06:49.190 回答
1

必须使用不安全指针才能正确表示二进制格式的负数。

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))
}

https://play.golang.org/p/GxXjjWMyC4x

于 2019-04-23T12:45:03.743 回答