如何使用math/big对bigInt取模?DivMod调用参数与返回值疑问
问题解决及代码修正
1. DivMod第三个参数的作用
big.Int.DivMod 的方法签名是:
func (z *Int) DivMod(x, y, m *Int) (*Int, *Int)
参数说明:
z:用于存储商的结果(如果不需要商,可以传nil,或者一个临时的big.Int实例)x:被除数y:除数m:用于存储余数的结果,必须传入一个*big.Int(比如new(big.Int))
方法返回的两个值就是传入的 z 和 m,相当于把计算结果赋值给这两个参数后再返回。
2. 只需要取模结果的简化写法
如果仅需要余数,没必要用DivMod,直接用big.Int.Mod方法更简洁,签名是:
func (z *Int) Mod(x, y *Int) *Int
它直接返回x % y的结果,存储在z中。
3. 代码修正
原代码存在三个问题:缺少DivMod的第三个参数、错误变量err未定义(DivMod不会返回错误,除数为0会直接panic)、big.Int不能用/运算符(必须调用Div方法)。
修正后的两种写法:
方式一:用DivMod(适合需要保留商的场景,此处忽略商)
// 用nil占位接收商,第三个参数传入新的big.Int存储余数 _, m := new(big.Int).DivMod(big.NewInt(100), big.NewInt(1024), new(big.Int)) // 调用Div方法计算m除以8 bytePos := new(big.Int).Div(m, big.NewInt(8))
方式二:用Mod(更适合仅需余数的场景)
// 直接计算100%1024的余数 m := new(big.Int).Mod(big.NewInt(100), big.NewInt(1024)) // 调用Div方法计算m除以8 bytePos := new(big.Int).Div(m, big.NewInt(8))
内容的提问来源于stack exchange,提问作者l33t
相关产品推荐
相关产品推荐

