C биты печати
Я пытаюсь написать программу на C, которая печатает биты int.
по какой-то причине я получаю неправильные значения,
void printBits(unsigned int num){
unsigned int size = sizeof(unsigned int);
unsigned int maxPow = 1<<(size*8-1);
printf("MAX POW : %u\n",maxPow);
int i=0,j;
for(;i<size;++i){
for(j=0;j<8;++j){
// print last bit and shift left.
printf("%u ",num&maxPow);
num = num<<1;
}
}
}
Мой вопрос, first, почему я получаю этот результат (для printBits (3)).
MAX POW: 2147483648 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2147483648 214748364 8
второй есть ли лучший способ сделать это?
Ответы
Ответ 1
Вы правильно вычисляете результат, но вы не печатаете его правильно. Также вам не нужен второй цикл:
for(;i<size*8;++i){
// print last bit and shift left.
printf("%u ",num&maxPow ? 1 : 0);
num = num<<1;
}
Если вы хотите показать, вы можете заменить условное обозначение двумя восклицательными знаками:
printf("%u ", !!(num&maxPow));
Ответ 2
Результат получается потому, что num&maxPow
равен 0 или maxPow
. Чтобы напечатать 1 вместо maxPow
, вы можете использовать printf("%u ", num&maxPow ? 1 : 0);
. Альтернативный способ печати битов -
while(maxPow){
printf("%u ", num&maxPow ? 1 : 0);
maxPow >>= 1;
}
то есть. смещение битовой маски справа вместо num
влево. Цикл заканчивается, когда установленный бит маски сбрасывается.
Ответ 3
Чтобы обратиться к второй точке, я бы рассмотрел следующее, что упрощено для упрощения понимания.
void printBits(unsigned int num)
{
for(int bit=0;bit<(sizeof(unsigned int) * 8); bit++)
{
printf("%i ", num & 0x01);
num = num >> 1;
}
}
Ответ 4
void print_bits(unsigned int x)
{
int i;
for(i=8*sizeof(x)-1; i>=0; i--) {
(x & (1 << i)) ? putchar('1') : putchar('0');
}
printf("\n");
}