0

プログラムの 2 番目の部分を修正して、10 進数を 2 進数に変換するのに助けが必要です。助けてください?

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

int main()
{

    char string[100];
    int s;
    char a;   
    char j;
    int sum = 0;
    int r;
    int q;

    printf("B = B to D\n");
    printf("D = D to B\n");
    printf("choose which one to convert to:");
    scanf("%c%c", &a, &j);

    if (a == 'B') 
    {
        printf("enter binary number to convert to decimal: ");
        scanf("%s", string);

        for(s = strlen(string)-1; s >= 0; s--)
        {

            if(string[s] == '1')
            {
                sum = sum + pow(2, strlen(string) - (s +1));
            }
        }
        printf("the decimal number is: %d\n", sum);
    }

    if (a == 'D')
    {
        printf("enter decimal number to convert to binary: ");
        scanf("%s", string);

        while (r > 0)
        {
            r = q%2;
            q = q%2;
        } 

        printf("the binary number is: %d\n", r);

    }

    return 0;
}
4

3 に答える 3

1

このC99コードは、負の数を符号付きの2進数の文字列として出力する場合に役立ちます。

if (a == 'D')
{
    int r;
    printf("enter decimal number to convert to binary: ");
    scanf("%d", &r);
    int i = 0;
    int p = (r >= 0) ? (r = -r, 1) : 0;
    string[i++] = '\0';

    do
    {
        string[i++] = (r % 2) == 0 ? '0' : '1';
        r /= 2;
    } while (r != 0);
    if (!p)
        string[i++] = '-';

    int k = 0;
    while (--i > k)
    {
        char t = string[i];
        string[i] = string[k];
        string[k++] = t;
    }

    printf("the binary number is: %s\n", string);
}

たとえば、-1234(decimal)が与えられた場合、出力は-10011010010(binary)になります。また、両方の極値を処理します:INT_MAX-INT_MAXおよびINT_MIN(32ビットを想定int):

B = B to D
D = D to B
choose which one to convert to: D
enter decimal number to convert to binary: 2147483647
the binary number is: 1111111111111111111111111111111

B = B to D
D = D to B
choose which one to convert to: D
enter decimal number to convert to binary: -2147483647
the binary number is: -1111111111111111111111111111111

B = B to D
D = D to B
choose which one to convert to: D
enter decimal number to convert to binary: -2147483648
the binary number is: -10000000000000000000000000000000

一方、値に対応するビットパターンが必要な場合は、JoachimPileborgの回答がそれを行います。

(C89が要求するようにブロックの開始時ではなく、ブロックの途中の便利なポイントで変数を宣言するため、C99コードです。)

于 2012-08-16T06:37:04.137 に答える
1

最も簡単な方法は、文字列入力を適切な整数に変換し(たとえば、を使用strtol)、その数値を1と0のみを含む文字列に変換することです。

何かのようなもの:

/* Convert a (possibly signed) decimal number in a string to a long integer */
unsigned long number = (unsigned long) strtol(string, NULL, 10);

char output_string[65];  /* If longs are 64 bits, plus one for terminator */
char *output_ptr = output_string;

/* Start with the highest bit, go down to the lowest */
/* sizeof(long) is either 4 or 8 depending on 32 or 64 bit platforms */
/* Multiply with 8 to get the number of bits */
/* -1 because bits are numbered from 0 to 31 (or 63) */
for (int bit = (sizeof(unsigned long) * 8) - 1; bit >= 0; bit--)
{
    /* Using right shift to get the current bit into the lowest position */
    /* Doing bitwise AND to see if the lowest bit is a one or a zero */
    /* Adding '0' makes a a printable ASCII value of a digit */
    *output_ptr++ = ((number >> bit) & 1) + '0';

    /* `*output_ptr` gets the value that `output_ptr` points to */
    /* Then use the `++` operator to increase the pointer */
    /* Now `output_ptr` points to the next character in `output_string` */
}

/* Terminate string */
*output_ptr = '\0';

printf("%ld in binary is %s\n", number, output_string);
于 2012-08-16T05:52:42.923 に答える
1

ここにはいくつかの問題があります。まず、r を初めてチェックするときは、初期化されていません。もう 1 つの問題は、while ループを実行するたびに r と q の両方を同じ値に設定していることです。おそらく、q = q%2 ではなく q = q/2 が必要です。最後に、ビットの文字列を構築する代わりに、ループを通過するたびに r を上書きしています。やりたいことの擬似コードを次に示します。

 output_string = ""

 while input > 0:
     output_string = concat(input%2, output_string)
     input /= 2

 print output_string

読み込んだ文字列を整数に変換してqに入れることも決してないので、それも行う必要があることに注意してください。

于 2012-08-16T00:54:32.590 に答える