int howManyBits(int x) {
int concatenate;
int bias;
int sign = x >> 31; //get the sign
x = (sign & (~x)) | (~sign & x);
concatenate = (!!(x >> 16)) << 4;
concatenate |= (!!(x >> (concatenate + 8))) << 3;
concatenate |= (!!(x >> (concatenate + 4))) << 2;
concatenate |= (!!(x >> (concatenate + 2))) << 1;
concatenate |= x >> (concatenate + 1);
bias = !(x^0);
return concatenate + 2 + (~bias + 1);
}
Этот код представлен как способ вычислить минимальное количество битов, требуемых для представления целого числа n
в дополнение до 2, в предположении, что тип int
данных представлен 32 битами. Правое смещение считается арифметическим.Может кто-нибудь объяснить эту функцию побитовое вычислить журнал (п)
Я понимаю, что базовый метод состоит в том, чтобы взять лог-базу 2 из n
, округлить ее, а затем добавить 1 бит для учета знакового бита.
Я также понимаю, что левый сдвиг эквивалентен умножению на 2 и сдвига вправо эквивалентен делению на 2.
, как говорится, без комментариев, которые я не могу расшифровать, что этот код делает дальше участок, где он получает значение знакового бита. Я работал над ним на карандаше и бумаге с образцом int
значения 5 - код работает, но я не понимаю, почему.
Может ли кто-нибудь дать интуитивное описание того, что делает код?