2016-09-10 28 views
1

10進数を2進数(最大16ビット)に変換しようとしています。私の機能は8ビットまで完璧に動作しますが、16ビットまでの数字を印刷したい場合は文字の印刷を停止します。 私は8ビットのデータ型として "int"を使用しましたが、16ビットを格納したいので、私はすべての変数にunsigned long intを使用しています。10進数から2進数への変換(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'のような明示的な幅の型の1つを考慮することもできます。 –

+9

'2^15'はあなたが思うことを意味するものではありません。実際に何をしているのかについては、[この図を参照](http://en.cppreference.com/w/c/language/operator_arithmetic)を参照してください。 – WhozCraig

+0

それは私の問題でした。私はいつもそれを忘れています。私はpow(2,15)を使用しています。今、働いています。ありがとうございます。 – tadm123

答えて

4
mask = 2^15; 

あなたが2^15を期待しているものにmaskの値を設定していないことが215のビットごとのXORである電源15に上げNO 2です。

バイナリで1000 0000 0000 0000が必要です。その数字は、16進数で0x8000になります。したがって、次のように使用してください:

mask = 0x8000; 

あなたのアルゴリズムで意味をなさないものを使用することもできます。

mask = 1u << 15; 
+1

OPのシステムは16ビットの 'int/unsigned'を持つかもしれないので、' 1u << 15'を使う方が良いでしょう。 – chux

+0

@chux、良い点。ありがとう。 –

関連する問題