diff --git a/AK/IntegralMath.h b/AK/IntegralMath.h index 80d74694ae7..03be42110a9 100644 --- a/AK/IntegralMath.h +++ b/AK/IntegralMath.h @@ -15,7 +15,7 @@ namespace AK { template constexpr T exp2(T exponent) { - return 1u << exponent; + return static_cast(1) << exponent; } template diff --git a/Tests/AK/TestIntegerMath.cpp b/Tests/AK/TestIntegerMath.cpp index 73168a52d46..c5d9b658c54 100644 --- a/Tests/AK/TestIntegerMath.cpp +++ b/Tests/AK/TestIntegerMath.cpp @@ -36,3 +36,21 @@ TEST_CASE(is_power_of) check_prime.operator()<97>(9); check_prime.operator()<257>(7); } + +TEST_CASE(exp2) +{ + EXPECT_EQ(AK::exp2(0), 1ull); + EXPECT_EQ(AK::exp2(1), 2ull); + EXPECT_EQ(AK::exp2(6), 64); + EXPECT_EQ(AK::exp2(7), 128); + EXPECT_EQ(AK::exp2(9), 512); + EXPECT_EQ(AK::exp2(14), 16384); + EXPECT_EQ(AK::exp2(15), 32768); + EXPECT_EQ(AK::exp2(17), 131072u); + EXPECT_EQ(AK::exp2(30), 1073741824); + EXPECT_EQ(AK::exp2(31), 2147483648); + EXPECT_EQ(AK::exp2(32), 4294967296); + EXPECT_EQ(AK::exp2(33), 8589934592ull); + EXPECT_EQ(AK::exp2(62), 4611686018427387904); + EXPECT_EQ(AK::exp2(63), 9223372036854775808ull); +}