]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.4] math/big: bug in AndNot(x,y) for x>0,y<0.
authorKeith Randall <khr@golang.org>
Fri, 16 Jan 2015 04:45:07 +0000 (20:45 -0800)
committerAndrew Gerrand <adg@golang.org>
Tue, 17 Feb 2015 06:48:38 +0000 (06:48 +0000)
The comment says to use (y-1), but then we did add(y.abs, natOne).  We meant sub.

Fixes #9609

Change-Id: I4fe4783326ca082c05588310a0af7895a48fc779
Reviewed-on: https://go-review.googlesource.com/2961
Reviewed-by: Robert Griesemer <gri@golang.org>
(cherry picked from commit c6ddca2aec4218e1af7f51fad3b761afb33b4c20)
Reviewed-on: https://go-review.googlesource.com/5001

src/math/big/int.go
src/math/big/int_test.go

index d22e39e7c94fa3591b61236eb433e4130bdf0d86..ade5c2fc8cddb151b07e731b280e93500292d0b6 100644 (file)
@@ -887,7 +887,7 @@ func (z *Int) AndNot(x, y *Int) *Int {
        }
 
        // x &^ (-y) == x &^ ^(y-1) == x & (y-1)
-       y1 := nat(nil).add(y.abs, natOne)
+       y1 := nat(nil).sub(y.abs, natOne)
        z.abs = z.abs.and(x.abs, y1)
        z.neg = false
        return z
index 6070cf325d206ed6ec508cf3805ac3dfac9c23c6..2d762dbc89f49db4e33e7746792eea7605364179 100644 (file)
@@ -1201,6 +1201,7 @@ var bitwiseTests = []struct {
        {"-0x01", "-0x01", "-0x01", "-0x01", "0x00", "0x00"},
        {"0x07", "0x08", "0x00", "0x0f", "0x0f", "0x07"},
        {"0x05", "0x0f", "0x05", "0x0f", "0x0a", "0x00"},
+       {"0xff", "-0x0a", "0xf6", "-0x01", "-0xf7", "0x09"},
        {"0x013ff6", "0x9a4e", "0x1a46", "0x01bffe", "0x01a5b8", "0x0125b0"},
        {"-0x013ff6", "0x9a4e", "0x800a", "-0x0125b2", "-0x01a5bc", "-0x01c000"},
        {"-0x013ff6", "-0x9a4e", "-0x01bffe", "-0x1a46", "0x01a5b8", "0x8008"},