Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary 从整数到其二进制表示的转换_Binary_Go_Numeric - Fatal编程技术网

Binary 从整数到其二进制表示的转换

Binary 从整数到其二进制表示的转换,binary,go,numeric,Binary,Go,Numeric,有人知道Go中是否有任何内置功能,可以将任何一种数字类型转换为二进制数形式吗 例如,如果123是输入,字符串“1111011”将是输出。strconv包具有FormatInt,它接受int64并允许您指定基 n := int64(123) fmt.Println(strconv.FormatInt(n, 2)) // 1111011 演示: func formatt(i int64,base int)字符串 Formatt返回给定基中i的字符串表示形式,对于2,另请参见包: 基于@Mark

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


例如,如果
123
是输入,字符串
“1111011”
将是输出。

strconv包具有
FormatInt
,它接受
int64
并允许您指定基

n := int64(123)

fmt.Println(strconv.FormatInt(n, 2)) // 1111011
演示:

func formatt(i int64,base int)字符串

Formatt返回给定基中i的字符串表示形式,对于2,另请参见包:


基于@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()
}
/*--在评论中归功于Dave C--*/
包干管
进口(
“字节”
“fmt”
)
func main(){
fmt.Printf(“\n”,fmtBits([]字节{0xDE,0xAD,0xBE,0xEF,0xF0,0x0D,0xDE,0xAD,0xBE,0xEF,0xF0,0x0D}))
//输出:
// 
}
func fmtBits(数据[]字节)[]字节{
var buf字节。缓冲区
对于u,b:=范围数据{
格式Fprintf(&buf,“%08b”,b)
}
buf.Truncate(buf.Len()-1)//删除额外空间
返回buf.Bytes()
}

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

x := big.NewInt(123)
s := fmt.Sprintf("%b", x)
// s == "1111011"
因为
*big.Int
实现了接口


取自

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

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

结果:

0 == 00000000
1 == 00000001
2 == 00000010
3 == 00000011
4 == 00000100
5 == 00000101

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

s := fmt.Sprintf("%b", 123)
fmt.Println(s)                 // 1111011
要获得更丰富的表示,您可以使用
不安全的
包(强烈不推荐)作为

a:=int64(123)
byteSliceRev:=*(*[8]字节)(不安全的指针(&a))
字节片:=make([]字节,8)
对于i:=0;i<8;i++{
byteSlice[i]=byteSliceRev[7-i]
}
fmt.Printf(“%b\n”,字节片)

这也适用于负整数。

这是自动完成的。十进制数是以二进制形式转换和使用的。编程语言中的数字已经以二进制形式存储。也许你的意思是在基地2输出它们?还是32位2的补码基数2?当然,这两种方法对于浮点数都没有意义,因为您需要IEEE任何格式的文本表示。或者只是将原始位模式输出到流中?非常感谢…我需要更仔细地阅读手册。如何设置负int(带符号int)的格式,
fmt.Println(strconv.FormatInt(n,2))
-11
,但我想要两个的互补格式。这反过来又是什么呢?如果我需要二进制字符串中的整数?@majidarif,请使用
I,err:=strconv.ParseInt(“1101”,2,64)
如果要硬编码到stdout,则只需在循环中输出;如果它是一个格式化函数,那么让它返回
[]字节
。重复地向
字符串
添加这样的内容效率很低,最好使用
bytes.Buffer
之类的内容(或者如果只使用前导零,只使用带有普通
[]byte
strconv.AppendInt
)。在每次迭代中调用
strings.TrimSpace
,只是为了处理单个额外的空间,这是非常低效的。例如,1kB的输入速度快了约50倍,占用了约1/50的内存。我从未想过效率,但从各方面来看,你是正确的,你的解决方案比我的好得多,谢谢!显示超过64位的数据是我的目标:)如@Luke Antins所示,二进制输出的长度可以通过在百分比和b之间添加一个数字来指定。例如,“%08b”导致00000001。
s:=fmt.Sprintf(“%b”,123)
0 == 00000000
1 == 00000001
2 == 00000010
3 == 00000011
4 == 00000100
5 == 00000101
s := fmt.Sprintf("%b", 123)
fmt.Println(s)                 // 1111011
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)