Commit ef891e1c authored by Brian Kessler's avatar Brian Kessler Committed by Daniel Martí

math/big: implement Int.TrailingZeroBits

Implemented via the underlying nat.trailingZeroBits.

Fixes #29578

Change-Id: If9876c5a74b107cbabceb7547bef4e44501f6745
Reviewed-on: https://go-review.googlesource.com/c/go/+/160681Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 14a58d65
...@@ -448,6 +448,12 @@ func (x *Int) BitLen() int { ...@@ -448,6 +448,12 @@ func (x *Int) BitLen() int {
return x.abs.bitLen() return x.abs.bitLen()
} }
// TrailingZeroBits returns the number of consecutive least significant zero
// bits of |x|.
func (x *Int) TrailingZeroBits() uint {
return x.abs.trailingZeroBits()
}
// Exp sets z = x**y mod |m| (i.e. the sign of m is ignored), and returns z. // Exp sets z = x**y mod |m| (i.e. the sign of m is ignored), and returns z.
// If m == nil or m == 0, z = x**y unless y <= 0 then z = 1. // If m == nil or m == 0, z = x**y unless y <= 0 then z = 1.
// //
......
...@@ -1335,6 +1335,31 @@ func TestBitSet(t *testing.T) { ...@@ -1335,6 +1335,31 @@ func TestBitSet(t *testing.T) {
} }
} }
var tzbTests = []struct {
in string
out uint
}{
{"0", 0},
{"1", 0},
{"-1", 0},
{"4", 2},
{"-8", 3},
{"0x4000000000000000000", 74},
{"-0x8000000000000000000", 75},
}
func TestTrailingZeroBits(t *testing.T) {
for i, test := range tzbTests {
in, _ := new(Int).SetString(test.in, 0)
want := test.out
got := in.TrailingZeroBits()
if got != want {
t.Errorf("#%d: got %v want %v", i, got, want)
}
}
}
func BenchmarkBitset(b *testing.B) { func BenchmarkBitset(b *testing.B) {
z := new(Int) z := new(Int)
z.SetBit(z, 512, 1) z.SetBit(z, 512, 1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment