Предположим, сначала вы должны сделать это для 8-битных чисел.самый быстрый способ - это 256-байтовая таблица поиска с предварительно скомпилированными значениями:
static unsigned char highest_bit_num_LUT[256] = {0, 1, 2, 2, 3, etc }; // precomputed
unsigned diff = (unsigned)a ^ (unsigned)b; // sure you need XOR and not MINUS?
unsigned highest_bit_num = highest_bit_num_LUT[diff & 0xff];
, теперь расширяющая ее для большего числа битов:
static unsigned char highest_bit_num_LUT[256] = {0, 1, 2, 2, 3, etc }; // precomputed
unsigned diff = (unsigned)a ^ (unsigned)b; // sure you need XOR and not MINUS?
unsigned highest_bit_num = 0;
for (int i = 7; i >= 0; i--)
if (diff >> ( i*8) ){ // found most significant non-zero byte
highest_bit_num = i*8 + highest_bit_num_LUT[diff >> (i*8)];
break;
}
, поэтому теперь у нас есть максимум 8 итераций.
РЕДАКТИРОВАТЬ: было бы быстрее использовать идею DigitalRoss для первых 3 итераций, а затем использовать LUT.