Найти бит высшего порядка в C - PullRequest
41 голосов
/ 10 сентября 2008

то, что мне нужно, это то, что я могу ввести число, и оно вернет бит самого высокого порядка. Я уверен, что есть простой способ. Ниже приведен пример вывода (слева - ввод)

1 -> 1
2 -> 2
3 -> 2
4 -> 4
5 -> 4
6 -> 4
7 -> 4
8 -> 8
9 -> 8
...
63 -> 32

Ответы [ 13 ]

2 голосов
/ 11 сентября 2012
// Note doesn't cover the case of 0 (0 returns 1)
inline unsigned int hibit( unsigned int x )
{
  unsigned int log2Val = 0 ;
  while( x>>=1 ) log2Val++;  // eg x=63 (111111), log2Val=5
  return 1 << log2Val ; // finds 2^5=32
}
0 голосов
/ 09 мая 2015

Изобретенное мною решение - бинарный поиск битов.

uint64_t highestBit(uint64_t a, uint64_t bit_min, uint64_t bit_max, uint16_t bit_shift){
    if(a == 0) return 0;
    if(bit_min >= bit_max){
        if((a & bit_min) != 0)
            return bit_min;
        return 0;
    }
    uint64_t bit_mid = bit_max >> bit_shift;
    bit_shift >>= 1;
    if((a >= bit_mid) && (a < (bit_mid << 1)))
        return bit_mid;
    else if(a > bit_mid)
        return highestBit(a, bit_mid, bit_max, bit_shift);
    else
        return highestBit(a, bit_min, bit_mid, bit_shift);

}

Бит макс - самая высокая степень 2, поэтому для 64-битного числа это будет 2 ^ 63. Сдвиг битов должен быть инициализирован до половины количества битов, поэтому для 64 битов это будет 32.

0 голосов
/ 06 августа 2011

Почему бы просто не сделать это:

int HiBit(int num){ return (num & 0x80000000) >> 31; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...