From 5e28b71457e8c8ce20e19a28ce44c9d9b5f47844 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 15 Dec 2017 16:41:31 +0100 Subject: math utils: Add utilities to scan bit and clear it --- source/blender/blenlib/intern/math_bits_inline.c | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'source/blender/blenlib/intern/math_bits_inline.c') diff --git a/source/blender/blenlib/intern/math_bits_inline.c b/source/blender/blenlib/intern/math_bits_inline.c index e967ecbb3a3..d96cf969dae 100644 --- a/source/blender/blenlib/intern/math_bits_inline.c +++ b/source/blender/blenlib/intern/math_bits_inline.c @@ -44,6 +44,18 @@ MINLINE unsigned int bitscan_forward_uint(unsigned int a) return (unsigned int)bitscan_forward_i((int)a); } +MINLINE int bitscan_forward_clear_i(int *a) +{ + int i = bitscan_forward_i(*a); + *a &= (*a) - 1; + return i; +} + +MINLINE unsigned int bitscan_forward_clear_uint(unsigned int *a) +{ + return (unsigned int)bitscan_forward_clear_i((int *)a); +} + MINLINE int bitscan_reverse_i(int a) { BLI_assert(a != 0); @@ -61,6 +73,19 @@ MINLINE unsigned int bitscan_reverse_uint(unsigned int a) return (unsigned int)bitscan_reverse_i((int)a); } +MINLINE int bitscan_reverse_clear_i(int *a) +{ + int i = bitscan_reverse_i(*a); + /* TODO(sergey): This could probably be optimized. */ + *a &= ~(1 << (sizeof(int) * 8 - i - 1)); + return i; +} + +MINLINE unsigned int bitscan_reverse_clear_uint(unsigned int *a) +{ + return (unsigned int)bitscan_reverse_clear_i((int *)a); +} + MINLINE unsigned int highest_order_bit_uint(unsigned int n) { if (n == 0) { -- cgit v1.2.3