我尝试将一个big.Int
拆分为若干个int64
,每个int64
都是较大数字的一部分,标准偏移量为18位。例如,给定下面的输入值1234512351234088800000999
,我会得到下面的输出:[351234088800000999, 1234512]
。对于负数,我希望所有部分都是负数(即-1234512351234088800000999
产生[-351234088800000999, -1234512]
)。
我已经知道我可以这样做以得到我想要的结果:
func Split(input *big.Int) []int64 {
const width = 18
asStr := in.Coefficient().Text(10)
strLen := len(asStr)
offset := 0
if in.IsNegative() {
offset = 1
}
length := int(math.Ceil(float64(strLen-offset) / width))
ints := make([]int64, length)
for i := 1; i <= length; i++ {
start := strLen - (i * width)
end := start + width
if start < 0 || (start == 1 && asStr[0] == '-') {
start = 0
}
ints[i-1], _ = strconv.ParseInt(asStr[start:end], 10, 64)
if offset == 1 && ints[i-1] > 0 {
ints[i-1] = 0 - ints[i-1]
}
}
return ints
}
然而,我不喜欢使用字符串解析的想法,也不喜欢使用strconv
。有没有一种方法可以直接使用big.Int
来实现这一点?
1条答案
按热度按时间fcipmucu1#
您可以使用
DivMod
函数来完成此处所需的工作,但要特别注意处理负数:将每个输出乘以
input.Sign()
可以确保当输入为负时,每个输出都为负。输出值的和乘以1e18乘以它们在输出中的位置应该等于输入。