2016-09-10 4 views
1

Я пытаюсь преобразовать десятичное число в двоичный (максимум 16 бит). Моя функция отлично работает до 8 бит, но когда я хочу печатать цифры до 16 бит, она останавливает печать символов. Я использовал «int» в качестве моего типа данных для 8 бит, но так как я хочу хранить 16 бит, я использую unsigned long int в каждой переменной.C decimal to binary converter (16 бит)

Вот код:

/* Program to convert decimal to binary (16 bits) */ 

#include <stdio.h> 
#include <string.h> 

char *byte_to_binary_str(long unsigned int byte); 

int main() 
{ 

printf("%s",byte_to_binary_str(32768)); //1000000 0000000 
    return 0; 
} 

char *byte_to_binary_str(long unsigned int byte) 
{ 
    static char bit_string[17]; 
    bit_string[0] = '\0'; 

    long unsigned int mask; 
    for (mask = 2^15; mask > 0; mask >>= 1) { 
     /* Check if the mask bit is set */ 
     strcat(bit_string, byte & mask ? "1" : "0"); 
    } 

    return bit_string; 
} 

Мой выход дает мне:

0000 
Process returned 0 (0x0) execution time : 0.063 s 
Press any key to continue. 

Каждый знает, почему это происходит? Заранее спасибо.

+0

C 'unsigned int' будет иметь ширину не менее 16 бит. Вы также можете рассмотреть один из типов явной ширины, например 'uint16_t'. –

+9

'2^15' не означает, что вы думаете, что он делает. [См. Этот график] (http://en.cppreference.com/w/c/language/operator_arithmetic) для того, что он делает на самом деле. – WhozCraig

+0

Это была моя проблема. Я ВСЕГДА забываю об этом .. Я использую pow (2,15), и теперь он работает, спасибо большое – tadm123

ответ

4
mask = 2^15; 

не устанавливает значение mask к тому, что вы ожидаете 2^15 не 2 в степени 15. Это побитовое исключающее из 2 и 15.

Вам нужно что-то 1000 0000 0000 0000 в двоичном виде. Это число будет 0x8000 в шестнадцатеричном формате. Следовательно, использование:

mask = 0x8000; 

Вы также можете использовать что-то, что имеет смысл в вашем алгоритме.

mask = 1u << 15; 
+1

Поскольку система OP может иметь 16-битный 'int/unsigned', лучше использовать' 1u << 15'. – chux

+0

@chux, хороший пункт. Благодарю. –