2016-03-19 29 views
2

助けが必要です。これまで私は、入力値のバイナリ変換を表示する方法を考え出しましたが、バイナリ値を実際に使用できるように、これらのバイナリ値を配列に追加する方法についてのヒントが必要です。スイッチケースを介して配列を取り込むことは可能ですか?私がそうしたように、「0」の場合。 iはバイナリ[I]の値を印刷し、何らかの理由ではなく0000値をバイナリ値に変換して配列に格納する

int main() 
{ 

int i = 0; 
char hexstring[] = "24020004"; 
int binary[8]; 


while(hexstring[i]) 
{ 
    switch(hexstring[i]) 
    { 
     case '0': binary[i] = 0000; printf("%i", binary[i]); printf("0000"); break; 
     case '1': printf("0001"); break; 
     case '2': printf("0010"); break; 
     case '3': printf("0011"); break; 
     case '4': printf("0100"); break; 
     . 
     . 
     . 
     case 'f': printf("1111"); break; 
     default: printf("\nInvalid hexadecimal digit %c ", hexstring[i]); 
    } 
    i++; 
} 
return 0; 

}を、0を返すため

+0

whar abour 'case '0':binary [i] = 0x0;ブレーク; case '1':binary [i] = 0x1;ブレーク; ......場合 'f':バイナリ[i] = 0xf; "; –

+0

"..私はバイナリ[i]の値を出力すると、0000の代わりに0を返します。" - 'binary [i]'は数値(具体的には符号付き整数)であり、数字は先行ゼロを持っていません。 'printf'に' printf( "%04d"、binary [i]); 'を強制することができます。しかし、それは彼らが価値そのものに「保存されている」という意味ではありません。 – usr2564301

答えて

3

あなたはあなたがbinary[i]進定数を割り当てていることを言っているbinary[i] = 0000を書きます0です。先頭のゼロはすべて省略されています。しかし、最初のゼロは、定数がオクタルと解釈されるべきであることを示します。 別の例:int x = 000011は、には、11の8進値または9の10進値が割り当てられていることを意味します。これは、コンパイラが定数を理解する方法です。

値がメモリに格納されるとき、値が書き込まれたベースについては何もわかりません。あなたが知っているように、すべての数値はバイナリ表現で保存されます。ただし、数値には異なるベースでビューが多く含まれることがあります。 の数字で作業すると便利です。ビュー

整数のためprintfのための多くの指定子は、いくつかの表現を出力にありますが、彼らは%uある - 小数、%x - 進、%o - 進のために。残念ながら、バイナリ数値表現を出力するオプションはありません。 base2で数値を出力するには、各バイナリ数字(0または1)を手動で計算し、それを対応する順序で出力する必要があります。

2進数表現を出力するには、次のコードを使用してください。

void printInBase2(int n) { 
    if(n == 0) { printf("0"); return; } 
    int b = 0; 
    for(b = 0; n >> b + 1; b++); 
    for(; b >= 0; b--) 
     printf("%c", (n >> b) % 2 + '0'); 
} 

あなたがこれを行うことができ、文字列に格納された16進表現から数を読み取るには:あなたがやった同じようなことを行うことができますが、int binary[]配列に進数を格納したい場合には

unsigned int number; 
char hexstring[] = "24020004"; 
sscanf(hexstring, "%x", &number); 

文字列付き

case '0': binary[4 * i + 3] = 0, binary[4 * i + 2] = 0, binary[4 * i + 1] = 0, binary[4 * i] = 0; break; 
case '1': binary[4 * i + 3] = 0, binary[4 * i + 2] = 0, binary[4 * i + 1] = 0, binary[4 * i] = 1; break; 
case '2': binary[4 * i + 3] = 0, binary[4 * i + 2] = 0, binary[4 * i + 1] = 1, binary[4 * i] = 0; break; 
... 
case 'f': binary[4 * i + 3] = 1, binary[4 * i + 2] = 1, binary[4 * i + 1] = 1, binary[4 * i] = 1; break; 

このようにして、各バイナリディジットを個別に保存します。 binary配列はhexstringより4倍長くする必要があります。

+0

OPがあなたの 'C++ 'コードを質問タグ' C'で使用するのはむしろ難しいでしょうか? –

+0

@David C.ランキン、指摘してくれてありがとう。私はいくつかの編集を行います。それにもかかわらず、 –

+0

すべての助けをありがとう。私がやろうとしていたことの多くをクリアしました。 –

0

個々の16進値をどのように正確に保持/表現したいかによって、これにアプローチする方法はいくつかあります。それぞれの値をbinary[x]に保持し、問題に近づいたときに印刷出力(例:"0010")を作成することができます。正しい数値を保持する変数も作成するには、各16進値を適切な量だけシフトして値を作成します。

#include <stdio.h> 

enum { NBYTES = 8, NBAD = 128 }; 

int main (int argc, char **argv) { 

    int i = 0, j = 0, n = 0; 
    char *hexstring = argc > 1 ? argv[1] : "24020004", 
     nothex[NBAD] = ""; 
    unsigned int binary[NBYTES] = {0}, 
       value = 0; 

    while (j < NBYTES && hexstring[i]) /* validate j to prevent overflow */ 
    { 
     char *fmt = j > 0 ? "-%s" : "\n%s"; 
     switch (hexstring[i]) 
     { 
      case '0': binary[j] = 0b0000; printf (fmt, "0000"); break; 
      case '1': binary[j] = 0b0001; printf (fmt, "0001"); break; 
      case '2': binary[j] = 0b0010; printf (fmt, "0010"); break; 
      case '3': binary[j] = 0b0011; printf (fmt, "0011"); break; 
      case '4': binary[j] = 0b0100; printf (fmt, "0100"); break; 
      case '5': binary[j] = 0b0101; printf (fmt, "0101"); break; 
      case '6': binary[j] = 0b0110; printf (fmt, "0110"); break; 
      case '7': binary[j] = 0b0111; printf (fmt, "0111"); break; 
      case '8': binary[j] = 0b1000; printf (fmt, "1000"); break; 
      case '9': binary[j] = 0b1001; printf (fmt, "1001"); break; 
      case 'a': binary[j] = 0b1010; printf (fmt, "1010"); break; 
      case 'b': binary[j] = 0b1011; printf (fmt, "1011"); break; 
      case 'c': binary[j] = 0b1100; printf (fmt, "1100"); break; 
      case 'd': binary[j] = 0b1101; printf (fmt, "1101"); break; 
      case 'e': binary[j] = 0b1110; printf (fmt, "1110"); break; 
      case 'f': binary[j] = 0b1111; printf (fmt, "1111"); break; 
      default: nothex[n] = hexstring[i]; 
        n += n < NBAD - 1; 
        goto badval; 
     } 
     /* value - holding numeric value */ 
     value += ('0' <= hexstring[i] && hexstring[i] <= '9') ? 
       (hexstring[i] - '0') << ((NBYTES - 1 - j) * sizeof value) : 
       (hexstring[i] - 'W') << ((NBYTES - 1 - j) * sizeof value); 
     j++; 
     badval: 
     i++; 
    } 
    printf ("\n value : 0x%08x (%u)\n\n", value, value); 
    for (i = 0; i < NBYTES; i++) 
     printf (" binary[%d] : 0x%x\n", i, binary[i]); 
    if (*nothex) { 
     printf ("\nwarning: invalid hexadecimal digit(s) in input.\n"); 
     for (i = 0; i < n; i++) printf (" %c", nothex[i]); 
    } 
    putchar ('\n'); 

    return 0; 
} 

使用例/出力

$ ./bin/hex2bin 
0010-0100-0000-0010-0000-0000-0000-0100 
value : 0x24020004 (604110852) 

binary[0] : 0x2 
binary[1] : 0x4 
binary[2] : 0x0 
binary[3] : 0x2 
binary[4] : 0x0 
binary[5] : 0x0 
binary[6] : 0x0 
binary[7] : 0x4 

$ ./bin/hex2bin "cafebabe" 
1100-1010-1111-1110-1011-1010-1011-1110 
value : 0xcafebabe (3405691582) 

binary[0] : 0xc 
binary[1] : 0xa 
binary[2] : 0xf 
binary[3] : 0xe 
binary[4] : 0xb 
binary[5] : 0xa 
binary[6] : 0xb 
binary[7] : 0xe 

$ ./bin/hex2bin "hi-cafe-babe-up" 

1100-1010-1111-1110-1011-1010-1011-1110 
value : 0xcafebabe (3405691582) 

binary[0] : 0xc 
binary[1] : 0xa 
binary[2] : 0xf 
binary[3] : 0xe 
binary[4] : 0xb 
binary[5] : 0xa 
binary[6] : 0xb 
binary[7] : 0xe 

warning: invalid hexadecimal digit(s) in input. 
h i - - 

が終わっそれを見て、これはあなたが想定していたものであるなら、私に知らせて:ここでは一つのアプローチです。

関連する問題