У меня есть простая функция:
int bitcount( unsigned );
int shiftbit( unsigned val ) {
return (int)(~0U << (( sizeof(int)*CHAR_BIT ) - bitcount(val)));
}
Я подсчитываю количество бит в целом числе, а затем создаю битовую маску, в которой это число битов оставлено в порядке.Например, 0xABCD имеет 10 установленных битов и возвращает маску 0xFFC0000.
Функция отлично работает, за исключением случаев, когда значение счетчика битов равно нулю, в этом случае я получаю -1, 0xffffffff, когда мне просто нужно получить пустую битовую маску, т.е.0x0.Мне просто не понятно, почему это должно работать для каждого случая, кроме нуля.
Ответ
Так что я закончил тем, что изменил код следующим образом, который работает нормально и долженбыть портативным:
int shiftbit( unsigned val ) {
int bCount = bitcount(val);
return bCount ? (~0 << (( sizeof(int)*CHAR_BIT ) - bCount)) : 0;
}