Есть множество способов сделать это.
Вариант № 1.
int numBytes = 0;
do {
numBytes++;
} while (i >>= 8);
return (numBytes);
В приведенном выше примере это число, которое вы тестируете, и обычно оно работает для любого процессора, любого размера целого числа.
Однако это может быть не самым быстрым. Кроме того, вы можете попробовать серию операторов if ...
Для 32-битных целых чисел
if ((upper = (value >> 16)) == 0) {
/* Bit in lower 16 bits may be set. */
if ((high = (value >> 8)) == 0) {
return (1);
}
return (2);
}
/* Bit in upper 16 bits is set */
if ((high = (upper >> 8)) == 0) {
return (3);
}
return (4);
Для 64-битных целых чисел требуется другой уровень операторов if.
Если скорость этой подпрограммы так же критична, как вы говорите, возможно, стоит сделать это в ассемблере, если вы хотите использовать ее как вызов функции. Это может позволить вам избежать создания и уничтожения кадра стека, сохраняя несколько дополнительных тактов, если это так важно.