summaryrefslogtreecommitdiff
path: root/mysys/my_bit.c
diff options
context:
space:
mode:
Diffstat (limited to 'mysys/my_bit.c')
-rw-r--r--mysys/my_bit.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/mysys/my_bit.c b/mysys/my_bit.c
index 81d63246e7a..5a9b1187c83 100644
--- a/mysys/my_bit.c
+++ b/mysys/my_bit.c
@@ -75,3 +75,33 @@ uint my_count_bits_ushort(ushort v)
return nbits[v];
}
+
+/*
+ Next highest power of two
+
+ SYNOPSIS
+ my_round_up_to_next_power()
+ v Value to check
+
+ RETURN
+ Next or equal power of 2
+ Note: 0 will return 0
+
+ NOTES
+ Algorithm by Sean Anderson, according to:
+ http://graphics.stanford.edu/~seander/bithacks.html
+ (Orignal code public domain)
+
+ Comments shows how this works with 01100000000000000000000000001011
+*/
+
+uint32 my_round_up_to_next_power(uint32 v)
+{
+ v--; /* 01100000000000000000000000001010 */
+ v|= v >> 1; /* 01110000000000000000000000001111 */
+ v|= v >> 2; /* 01111100000000000000000000001111 */
+ v|= v >> 4; /* 01111111110000000000000000001111 */
+ v|= v >> 8; /* 01111111111111111100000000001111 */
+ v|= v >> 16; /* 01111111111111111111111111111111 */
+ return v+1; /* 10000000000000000000000000000000 */
+}