Go에 숫자 유형 중 하나를 이진 숫자 형식으로 변환하기위한 내장 기능이 있는지 누구든지 아이디어를 얻었습니다.
예를 들어 123
입력 인 경우 문자열 "1111011"
이 출력이됩니다.
Go에 숫자 유형 중 하나를 이진 숫자 형식으로 변환하기위한 내장 기능이 있는지 누구든지 아이디어를 얻었습니다.
예를 들어 123
입력 인 경우 문자열 "1111011"
이 출력이됩니다.
답변:
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는 2 <= base <= 36에 대해 주어진 기수로 i의 문자열 표현을 반환합니다. 결과는 숫자 값> = 10에 대해 소문자 'a'에서 'z'를 사용합니다.
fmt.Println(strconv.FormatInt(n, 2))
은 -11
이지만 2의 칭찬 형식을 원합니다.
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
비슷한 것에 반복적으로 추가 하는 것은 비효율적이며, a 와 같은 것을 사용하는 것이 더 좋습니다 bytes.Buffer
(또는 선행 0을 사용하는 경우에만 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))
}