math utils: Add utilities to scan bit and clear it

This commit is contained in:
2017-12-15 16:41:31 +01:00
parent de9e5a0926
commit 5e28b71457
2 changed files with 33 additions and 0 deletions

View File

@@ -35,10 +35,18 @@ extern "C" {
MINLINE int bitscan_forward_i(int a);
MINLINE unsigned int bitscan_forward_uint(unsigned int a);
/* Similar to above, but also clears the bit. */
MINLINE int bitscan_forward_clear_i(int *a);
MINLINE unsigned int bitscan_forward_clear_uint(unsigned int *a);
/* Search the value from MSB to LSB for a set bit. Returns index of this bit. */
MINLINE int bitscan_reverse_i(int a);
MINLINE unsigned int bitscan_reverse_uint(unsigned int a);
/* Similar to above, but also clears the bit. */
MINLINE int bitscan_reverse_clear_i(int *a);
MINLINE unsigned int bitscan_reverse_clear_uint(unsigned int *a);
/* NOTE: Those functions returns 2 to the power of index of highest order bit. */
MINLINE unsigned int highest_order_bit_uint(unsigned int n);
MINLINE unsigned short highest_order_bit_s(unsigned short n);

View File

@@ -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) {