Go gotcha: What's wrong with the remainder (modulo) operator?
Why isn't -1 odd?
func Odd(n int) bool {
return n%2 == 1
}
func main() {
fmt.Println(Odd(-1)) // false
}
Answer
The remainder operator can give negative answers if the dividend is negative: if n
is an odd negative number, n % 2
equals -1
.
The quotient q = x / y
and remainder r = x % y
satisfy the relationships
x = q*y + r and |r| < |y|
where x / y
is truncated towards zero.
x y x / y x % y
5 3 1 2
-5 3 -1 -2
5 -3 -1 2
-5 -3 1 -2
(There is one exception: if x
is the most negative value of its type, the quotient q = x / -1
is equal to x
. See Compute absolute values for more on this anomaly.)
One solution is to write the function like this:
// Odd tells whether n is an odd number.
func Odd(n int) bool {
return n%2 != 0
}
You can also use the bitwise AND operator &
:
// Odd tells whether n is an odd number.
func Odd(n int) bool {
return n&1 != 0
}
Comments
Be the first to comment!