0
#include <stdio.h>
#include <math.h>
/* converts to binary */

int main()
{
    unsigned int decimalNUM = 0;
    printf("Enter a number to be converted to binary.\t");
    scanf("%d", &decimalNUM);
    fflush(stdin);
    baseConv(decimalNUM);
    getchar();
    return 0;
}
baseConv(unsigned int n){
if (n == 0) ;
      while (n > 0){
      printf("%d", n%2);
      n = n >> 1;
              }
return 0;
}

私は今これを行う方法を知っていますが、逆に印刷されます。どうすればそれを元に戻すことができますか?

4

4 に答える 4

6

このような操作を逆にする方法が必要な場合、1つの方法はスタックデータ構造を使用することです。

メインループで値を出力する代わりに、それらをスタックにプッシュします。

次に、それが終了したら、スタックからアイテムをポップして印刷し、スタックが空になるまでそれを続けます。スタックはLIFO構造(後入れ先出し)と呼ばれ、生成されたのとは逆の順序で後で取得できるように保存するのに便利な方法です。

擬似コード:

def baseConv (n):
    create stack s
    while n > 0:
        push n % 2 onto s
        n = n >> 1
    while not empty(s):
        pop n from s
        print n

また、次のステートメントを追加する必要があります。

if (n == 0);

本当に有用なことは何もしません。

于 2011-02-04T04:11:38.693 に答える
1

スタックを回避できます..

最下位の桁から始めて変換し、印刷しているため、逆になっています。

最初に最高の部分を鍛えれば、逆に行くことができます

バイナリ0x8000など、ベースのintの最大除数を見つけます

0 の場合は、この除数で数値を割ります。何も出力しないでください。そうでない場合は、印刷を開始します。除数を基数で割ります。あなたの除数が0になるまで

于 2011-02-04T04:37:25.863 に答える
0

十分な大きさの文字列を割り当てて「0」で埋め、文字列に逆の順序で 1 を配置し、最初の「1」を見つけて、そのポイントから文字列を出力します

int cursor, lead_one;
char *buffer = malloc(sizeof(unsigned int)*8 + 1);
memset(buffer, '0', sizeof(unsigned int)*8);
buffer[sizeof(unsigned int)*8] = 0;

for (lead_one = cursor = sizeof(unsigned int)*8 - 1; n > 0; cursor--) {
    if (n & 1) {
        buffer[cursor] = '1';
        lead_one = cursor;
    }
    n >>= 1;
}
printf(buffer+lead_one);
于 2011-02-04T07:15:43.050 に答える
0

最上位ビットの値は、すべてのビットをオン (~unsigned(0)) にし、その値自体を右にシフトして XOR することで取得できます。次に、msb から lsb までの各ビットをテストします...

for (unsigned x = ~unsigned(0) ^ (~unsigned(0) >> 1); x; x >>= 1)
    putchar(x & n ? '1' : '0');
于 2011-02-04T05:32:56.097 に答える