Преобразование в двоичный с использованием побитового и битового сдвига

Я пытаюсь создать функцию для печати числа в двоичном формате с использованием побитового и побитового сдвига, но у меня возникают проблемы с его правильной печатью. Ниже приведен мой код.

void PrintInBinary( unsigned int decNum )
{
    int i = 0;
    unsigned int highestOne = 1 << (sizeof(unsigned int)*8 - 1);

    for( i = 0; i < sizeof(int)*8; i++ ) {
         printf( "%u", decNum & (highestOne >> i) );
    }
    printf("\n");
}


int main()
{
    unsigned int a = 128;
    PrintInBinary( a );
    system("PAUSE");
    return 0;
}

Вывод следующий:

0000000000000000000000001280000000

По сути, он печатает 2 ^ бит, а не просто 1 в каждой битовой позиции (например, если бы я хотел преобразовать 7 в двоичный код, это было бы 0000000... 00421 вместо 0000000... 00111). Это, вероятно, что-то тривиальное, что мне не хватает, но кто-нибудь поможет, ребята? Я занимался этим последние 20 минут, не могу понять что-то настолько простое.


person still.Learning    schedule 25.04.2012    source источник
comment
Кроме того, вместо sizeof(int) * 8 вы можете использовать sizeof(int) * CHAR_BIT.   -  person Jerry Coffin    schedule 25.04.2012
comment
Использование магических чисел, таких как 8, не очень хорошо.   -  person Sangeeth Saravanaraj    schedule 25.04.2012


Ответы (6)


Измените decNum & (highestOne >> i) на (decNum & (highestOne >> i)) != 0.

Многие люди также любят писать !!(decNum & (highestOne >> i)). Я признаю, что это мило, но менее читабельно, и я бы посоветовал вам не использовать это.

person Mark Byers    schedule 25.04.2012
comment
Хм, сработало! Но что не так с моей реализацией? Я думал, что использование оператора & привело к 1 или 0? - person still.Learning; 25.04.2012
comment
@user1343030 user1343030 Нет, в какой-то момент у вас есть 128 & 128, что равно 128. Вы получаете число с теми установленными битами, которые установлены в обоих операндах. - person Daniel Fischer; 25.04.2012
comment
Да, я забыл, что 0 справа от бита также считаются частью числа. Спасибо! - person still.Learning; 25.04.2012
comment
@ user1343030: Я забыл, что 0 справа от бита также считаются частью числа. Вы должны выписать мне чек на 1000000 долларов за помощь. Всего один доллар... ;-) - person Mark Byers; 25.04.2012

Использовать

printf( "%u", decNum & (highestOne >> i) > 0 ? 1 : 0 );
person thumbmunkeys    schedule 25.04.2012

Это, безусловно, один из способов сделать это с изменением, предложенным Марком, но я думаю, что этот способ намного читабельнее:

unsigned int decNum = 7;

for(i = 0; i < sizeof(int)*8; i++ ) 
{
  printf("%u", ((decNum >> i) & 1));
}
printf("\n");
person Hunter McMillen    schedule 25.04.2012

Если вы предпочитаете сохранять запись, я бы рекомендовал следующую функцию:

давайте посмотрим на следующую функцию, которая получает беззнаковое целое число decNum и преобразует его в двоичное:

/*#define BITS 8*/
int size = sizeof(unsigned int)*BITS;

char arr[size] ;

int i;
/* 
    now lets thinkk...

    shift by i=0 to the right:
    4 = 00...00 0100 &
    1 = 00...00 0001
    -----------------
        00...00 0000
    now we know that we need to enter 0 in the 1-rd place in the arr

    shift by i=1 to the right:
    4 = 00...00 0010 &
    1 = 00...00 0001
    -----------------
        00...00 0000
    now we know that we need to enter 0 in the 2-rd place in the arr

    shift by i=2 to the right:
    4 = 00...00 0001 &
    1 = 00...00 0001
    -----------------
        00...00 0001
    now we know that we need to enter 1 in the 3-rd place in the arr

    and so on...

 */
    for(i=0; i<size; ++i) {
         int shifted = (decNum >> i);
         arr[(size-1)-i] = (shifted&1)?'1':'0';
    }

printf("The binary of %d in %d bits:\n",decNum, size);

/*now lets print the array*/
for (i=0; i < size ; i++){
         printf("%c",arr[i]);
}
printf("\n");
person Matan Touti    schedule 18.04.2013

decNum & (highestOne >> i) просто делает оценку. Если оценка true, то вы должны напечатать 1, иначе, если она false, то напечатать 0.

decNum & (highestOne >> i) ? 1 : 0

ПРИМЕЧАНИЕ. OTOH, пожалуйста, избегайте использования магических чисел, таких как 8.

person Sangeeth Saravanaraj    schedule 25.04.2012

person    schedule
comment
хм, это тоже творческий способ! - person still.Learning; 25.04.2012