Интересная касательная к этому вопросу - думаю, я знаю своего рода умный ответ на вопрос «Сколько битов установлено в этом значении»
#include <stdint.h>
#include <stdio.h>
uint8_t NumBitsSet(uint32_t value){
uint8_t num_bits_set = 0;
while(value != 0){
value = value & (value-1);
num_bits_set++;
}
return num_bits_set;
}
int main(int argc, char *argv[]){
uint32_t value = 2147483648;
printf("numbits set in %x = %d", value, NumBitsSet(value));
return 0;
}
Вы можете использовать это как основу для определения, установлен ли точно один бит, хотя вам нужно сделать специальную проверку для нуля.
uint8_t exactly_one_bit_set = (value & (value-1)) == 0 ? 1 : 0;
Хитрость в том, что если значение установлено на один бит, то на единицу меньше этого значения будут установлены все биты ниже этого бита, и этот бит будет очищен. и эти две вещи вместе всегда будут равны нулю.