From 5af37530d41a937b43892d199d706f935c5c0b7e Mon Sep 17 00:00:00 2001 From: Prcuvu Date: Wed, 2 Sep 2015 20:05:02 +0800 Subject: [PATCH] Rewrite power_of_two, using binary search. --- src/RageUtil.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/RageUtil.cpp b/src/RageUtil.cpp index 6efc61883b..0ba005a57a 100644 --- a/src/RageUtil.cpp +++ b/src/RageUtil.cpp @@ -178,10 +178,25 @@ float fmodfp(float x, float y) return x; } -int power_of_two( int iInput ) +int power_of_two( int input ) { - return static_cast(powf(2.0f, ceilf( - log(static_cast(iInput)) / log(2.0f)))); + int exp = 31, i = input; + if (i >> 16) + i >>= 16; + else exp -= 16; + if (i >> 8) + i >>= 8; + else exp -= 8; + if (i >> 4) + i >>= 4; + else exp -= 4; + if (i >> 2) + i >>= 2; + else exp -= 2; + if (i >> 1 == 0) + exp -= 1; + int value = 1 << exp; + return (input == value) ? value : (value << 1); } bool IsAnInt( const RString &s )