math utils: Add utilities to scan bit and clear it
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user