aboutsummaryrefslogtreecommitdiff
path: root/lib/std/math.zig
diff options
context:
space:
mode:
authorr00ster91 <r00ster91@proton.me>2023-05-29 01:48:24 +0200
committerAndrew Kelley <andrew@ziglang.org>2023-06-18 10:42:03 -0700
commit2839e35d1c06ca5b6bda1f20ae870f2b2fbbbfb1 (patch)
treee563096f2b145f0edbc6e556b43284d5fd006582 /lib/std/math.zig
parentc13ac52972b864ff3aa9fc373f96d7ede41d5a31 (diff)
downloadzig-2839e35d1c06ca5b6bda1f20ae870f2b2fbbbfb1.tar.gz
zig-2839e35d1c06ca5b6bda1f20ae870f2b2fbbbfb1.zip
std.math.isPowerOfTwo: add tests and doc comment and improve assert
The assert is changed from `int != 0` to `int > 0` because negative integers always return `false`. Python's `math.log2` does the same and errors for 0 or negative integers.
Diffstat (limited to 'lib/std/math.zig')
-rw-r--r--lib/std/math.zig19
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/std/math.zig b/lib/std/math.zig
index e60e964747..e62a208d0b 100644
--- a/lib/std/math.zig
+++ b/lib/std/math.zig
@@ -1111,9 +1111,22 @@ pub fn alignCast(comptime alignment: u29, ptr: anytype) AlignCastError!@TypeOf(@
return @alignCast(alignment, ptr);
}
-pub fn isPowerOfTwo(v: anytype) bool {
- assert(v != 0);
- return (v & (v - 1)) == 0;
+/// Asserts `int > 0`.
+pub fn isPowerOfTwo(int: anytype) bool {
+ assert(int > 0);
+ return (int & (int - 1)) == 0;
+}
+
+test isPowerOfTwo {
+ try testing.expect(isPowerOfTwo(@as(u8, 1)));
+ try testing.expect(isPowerOfTwo(2));
+ try testing.expect(!isPowerOfTwo(@as(i16, 3)));
+ try testing.expect(isPowerOfTwo(4));
+ try testing.expect(!isPowerOfTwo(@as(u32, 31)));
+ try testing.expect(isPowerOfTwo(32));
+ try testing.expect(!isPowerOfTwo(@as(i64, 63)));
+ try testing.expect(isPowerOfTwo(128));
+ try testing.expect(isPowerOfTwo(@as(u128, 256)));
}
/// Aligns the given integer type bit width to a width divisible by 8.