Hat jemand eine Idee, ob es in Go eine eingebaute Funktionalität gibt, um von einem der numerischen Typen in seine Binärzahlform zu konvertieren?
Wenn beispielsweise 123
die Eingabe wäre, wäre die Zeichenfolge "1111011"
die Ausgabe.
Hat jemand eine Idee, ob es in Go eine eingebaute Funktionalität gibt, um von einem der numerischen Typen in seine Binärzahlform zu konvertieren?
Wenn beispielsweise 123
die Eingabe wäre, wäre die Zeichenfolge "1111011"
die Ausgabe.
Antworten:
Das strconv
Paket hat FormatInt
, das ein akzeptiert int64
und Sie können die Basis angeben.
n := int64(123)
fmt.Println(strconv.FormatInt(n, 2)) // 1111011
DEMO: http://play.golang.org/p/leGVAELMhv
http://golang.org/pkg/strconv/#FormatInt
func FormatInt(i int64, base int) string
FormatInt gibt die Zeichenfolgendarstellung von i in der angegebenen Basis für 2 <= Basis <= 36 zurück. Das Ergebnis verwendet die Kleinbuchstaben 'a' bis 'z' für Ziffernwerte> = 10.
fmt.Println(strconv.FormatInt(n, 2))
ist -11
, aber ich möchte das Komplimentformat von zwei.
i, err := strconv.ParseInt("1101", 2, 64)
Siehe auch die fmt Paket:
n := int64(123)
fmt.Printf("%b", n) // 1111011
s := fmt.Sprintf("%b", 123)
Dieser Code funktioniert mit großen Ganzzahlen *big.Int
:
x := big.NewInt(123)
s := fmt.Sprintf("%b", x)
// s == "1111011"
weil *big.Int
implementiert die fmt.Formatter
Schnittstelle.
Entnommen aus https://stackoverflow.com/a/23317788/871134
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)
}
Ergebnisse in:
0 == 00000000
1 == 00000001
2 == 00000010
3 == 00000011
4 == 00000100
5 == 00000101
Aufbauend auf der Antwort von @Mark
Obwohl das OP gefragt hat, wie eine Ganzzahl gedruckt werden soll, möchte ich häufig Daten im Wert von mehr als 64 Bit anzeigen, ohne dass meine Augen verwirren:
/* --- 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()
}
Siehe diesen Code in play.golang.org
[]byte
. Das wiederholte Anhängen an ein solches Element string
ist ineffizient. Besser ist es, etwas wie ein zu verwenden bytes.Buffer
(oder wenn es nur führende Nullen verwendet, nur strconv.AppendInt
mit einer Ebene []byte
). Es strings.TrimSpace
ist sehr ineffizient, jede Iteration nur aufzurufen, um den einzelnen zusätzlichen Speicherplatz zu verwalten. Zum Beispiel ist so etwas wie play.golang.org/p/ifobZWv_du an einem 1-KB-Eingang ~ 50x schneller und verbraucht ~ 1/50 des Speichers.
Ein alternativer Weg für die akzeptierte Antwort wäre einfach zu tun
s := fmt.Sprintf("%b", 123)
fmt.Println(s) // 1111011
Für eine reichhaltigere Darstellung können Sie das unsafe
Paket (stark entmutigt) als verwenden
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)
Dies funktioniert auch für negative Ganzzahlen.
Unsichere Zeiger müssen verwendet werden, um negative Zahlen im Binärformat korrekt darzustellen.
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))
}