From 3acfd666b159b61d7693edbc4d0e26b1a1ea70bc Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 24 Jan 2014 13:25:18 +0100 Subject: calculating next power of two MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/algorithms/bits/Powers.java | 48 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) (limited to 'src/algorithms/bits') diff --git a/src/algorithms/bits/Powers.java b/src/algorithms/bits/Powers.java index 84c9399..2238bcd 100644 --- a/src/algorithms/bits/Powers.java +++ b/src/algorithms/bits/Powers.java @@ -22,7 +22,9 @@ package algorithms.bits; */ public class Powers { -£>for T in char byte short int long; do +£S=${T_S#*_} /** * Compute whether an integer is a power of two, * note that zero is indeed not a power of two @@ -35,6 +37,50 @@ public class Powers return (value & (value - 1)) == 0; /* The left hand side clears the least significant bit set */ /* Or alternatively: (value & -value) == value */ } + + /** + * Computes the nearest, but higher, power of two, + * independently of whether the current value is + * a power of two or not + * + * @param value The current value + * @return The next power of two + */ + public static £{T} nextPowerOf2(£{T} value) + { + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; +£>(( S > 1)) && + value |= value >> 8; +£>(( S > 2)) && + value |= value >> 16; +£>(( S > 4)) && + value |= value >> 32; + return (£{T})(value + 1); + } + + /** + * Computes the nearest, but higher, power of two, + * but only if the current value is not a power of two + * + * @param value The current value + * @return The next power of two + */ + public static £{T} toPowerOf2(£{T} value) + { + value -= 1; + value |= value >>> 1; + value |= value >>> 2; + value |= value >>> 4; +£>(( S > 1)) && + value |= value >>> 8; +£>(( S > 2)) && + value |= value >>> 16; +£>(( S > 4)) && + value |= value >>> 32; + return (£{T})(value + 1); + } £>done } -- cgit v1.2.3-70-g09d2