gpt4 book ai didi

go - 将整数 slice 转换为十六进制值的更好方法

转载 作者:行者123 更新时间:2023-12-01 21:16:06 25 4
gpt4 key购买 nike

我有一个仅包含零和一的int片段([]int{1,1,1,1,0,0,0,0})
我想将字符串表示形式转换为十六进制值。我正在将整数 slice 转换为字符串 slice ,然后执行strconv.ParseUint进行转换。

package main

import (
"fmt"
"log"
"strconv"
"strings"
)

func IntToString(values []int) string {
valuesText := []string{}
for i := range values {
valuesText = append(valuesText, strconv.Itoa(values[i]))
}
return strings.Join(valuesText, "")
}

func IntSliceToHex(in []int) (string, error) {
intString := IntToString(in)
ui, err := strconv.ParseUint(intString, 2, 64)
if err != nil {
return "", err
}
return fmt.Sprintf("%X", ui), nil
}

func HexToBin(hex string) (string, error) {
ui, err := strconv.ParseUint(hex, 16, 64)
if err != nil {
return "", err
}
return fmt.Sprintf("%b", ui), nil
}

func main() {
profile := []int{1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1}

hex, err := IntSliceToHex(profile)
if err != nil {
log.Fatalln(err)
}

bin, err := HexToBin(hex)
if err != nil {
log.Fatalln(err)
}

fmt.Println(hex, bin)
}
输出:F0F 111100001111
有一个更好的方法吗?

最佳答案

您应该使用移位操作来从 slice 中建立实际数字,而不是将每个位转换为字符串并进行解析。
您还应该保留内置的整数,而不是来回转换为字符串。

package main

import (
"fmt"
)

func main() {
profile := []int{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

final := uint64(profile[0])
for i := 1; i < len(profile); i++ {
final <<= 1
final += uint64(profile[i])
}
fmt.Printf("%X %b\n", final, final)
// Output: FFFFFFFFFFFF0000 1111111111111111111111111111111111111111111111110000000000000000
}
注意: final是一个无符号的64位整数,可以处理长度不超过64(包括64)的 profile slice 。对于较大的大小,请使用 big.Int

关于go - 将整数 slice 转换为十六进制值的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63895164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com