, 8- .
- 256- :
static unsigned char highest_bit_num_LUT[256] = {0, 1, 2, 2, 3, etc };
unsigned diff = (unsigned)a ^ (unsigned)b;
unsigned highest_bit_num = highest_bit_num_LUT[diff & 0xff];
now extends it for more bits:
static unsigned char highest_bit_num_LUT[256] = {0, 1, 2, 2, 3, etc };
unsigned diff = (unsigned)a ^ (unsigned)b;
unsigned highest_bit_num = 0;
for (int i = 7; i >= 0; i--)
if (diff >> ( i*8) ){
highest_bit_num = i*8 + highest_bit_num_LUT[diff >> (i*8)];
break;
}
so now we have no more than 8 iterations.
EDIT: It would be faster to use the idea of DigitalRoss for the first 3 iterations, and then use LUT.
source
share