1
0
mirror of https://github.com/golang/go synced 2024-11-26 21:21:34 -07:00

math/big: add SetUint64 and Uint64 functions to *Int

Implementation is mostly identical to passing a non-negative int64 to
SetInt64, and calling Int64 with a non-negative value in the *Int.
Fixes #4389.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6929048
This commit is contained in:
Luit van Drongelen 2012-12-11 12:19:10 -05:00 committed by Russ Cox
parent 1d46fc44b7
commit f4fc163d17
2 changed files with 50 additions and 0 deletions

View File

@ -51,6 +51,13 @@ func (z *Int) SetInt64(x int64) *Int {
return z
}
// SetUint64 sets z to x and returns z.
func (z *Int) SetUint64(x uint64) *Int {
z.abs = z.abs.setUint64(uint64(x))
z.neg = false
return z
}
// NewInt allocates and returns a new Int set to x.
func NewInt(x int64) *Int {
return new(Int).SetInt64(x)
@ -519,6 +526,19 @@ func (x *Int) Int64() int64 {
return v
}
// Uint64 returns the int64 representation of x.
// If x cannot be represented in an uint64, the result is undefined.
func (x *Int) Uint64() uint64 {
if len(x.abs) == 0 {
return 0
}
v := uint64(x.abs[0])
if _W == 32 && len(x.abs) > 1 {
v |= uint64(x.abs[1]) << 32
}
return v
}
// SetString sets z to the value of s, interpreted in the given base,
// and returns z and a boolean indicating success. If SetString fails,
// the value of z is undefined but the returned value is nil.

View File

@ -1135,6 +1135,36 @@ func TestInt64(t *testing.T) {
}
}
var uint64Tests = []uint64{
0,
1,
4294967295,
4294967296,
8589934591,
8589934592,
9223372036854775807,
9223372036854775808,
18446744073709551615, // 1<<64 - 1
}
func TestUint64(t *testing.T) {
in := new(Int)
for i, testVal := range uint64Tests {
in.SetUint64(testVal)
out := in.Uint64()
if out != testVal {
t.Errorf("#%d got %d want %d", i, out, testVal)
}
str := fmt.Sprint(testVal)
strOut := in.String()
if strOut != str {
t.Errorf("#%d.String got %s want %s", i, strOut, str)
}
}
}
var bitwiseTests = []struct {
x, y string
and, or, xor, andNot string