2

重複の可能性:
1 と 0 の文字列をバイナリ値に変換する

1024 文字 (0 と 1 を表す) を含む文字列があるとします。10進数の数値として(文字列としても)表示したい。トリッキーな部分は、サードパーティのライブラリを使用せずに C/C++ で実行する必要があることです。手がかりはありますか?

4

3 に答える 3

5

おそらくもっと効率的な方法がありますが、10進数の配列があり、最下位桁から実行される「左シフト」関数を実装し、それらを2倍にして次の桁に繰り越します。

次に、バイナリ データを一度に 1 ビットずつ読み取り、10 進配列を「左シフト」し、必要に応じて 2 進数で「OR」するだけです。

10 進数を繰り返し処理して、答えを出力します。

void outputAsDecimal(char *binary)
{
   char digits[1000]; // arbitrary size for now

   for (int i=0; i< 1000; ++i)
     digits[i] = 0;

   while (*binary != 0)
   {

   // shift the digits, with carry
     int carry = 0;

     for (int i = 0; i< 1000; ++i)
     {
       int d = digits[i] *2 + carry;
       carry = d > 9;
       digits[i] = d % 10;
     }

   // or in the new bit
     if (*binary++ == '1') 
       digits[0] |= 1;
   }

    // output with leading zeroes!
    for (int i = 999; i >=0; --i)
    {
      putchar(digits[i] + '0'); // convert to ascii
    }
}

ここで実行されていることを確認してください: http://ideone.com/CibAfw

于 2012-10-31T20:35:06.260 に答える
1

編集:ああ!1024 要件に気付きました。これにより、より複雑になりますが、考え方は変わりません。int number だけでなく、int number[32] (または long number[16] など) が必要です。

国境での計算は面倒ですが、不可能ではありません。わからない場合はお知らせください。

これは私にとってはうまくいきます。(int) で提供される値よりも大きい分解とサポート値は、読者の演習として残されています...

#include <stdio.h> // only to print - not needed in computation
int main(int argc, char *argv[]) {
  printf("Converting: %s\n", argv[1]);
  int number = 0x0;
  char * binaryString = argv[1];
  int index = 0;
  int asciiZero = '0';
  char curr = binaryString[index];
  while(curr != '\0') {
    number = (number << 1) | (curr - asciiZero);
    index++;
    curr = binaryString[index];
  }

  printf("As number: %d\n", number);

  int MAX_DIGITS = 10; //adjust accordingly...
  char buffer[MAX_DIGITS];
  index = 0;
  while(number > 0) {
    buffer[index] = ((char) number % 10) + asciiZero;
    index++;
    number = number / 10;
  }
  buffer[index] = '\0';

  printf("As string: %s\n", buffer);
 }

利用可能なプリミティブで提供される以上のものをサポートしたい場合は、複数の ints/longs/etc を含む構造体を作成できます。

于 2012-10-31T20:46:02.193 に答える
-1

1024 ビットの数値を 10 進数として表すことはできません。あなたが得ることができる最も近いものは、浮動小数点近似です。

編集:

という思いが生まれます。数字をスタックに入れて、そのように数えます。ただし、それらを一緒に追加する方法を理解する必要があります。これを行うには、独自の BigInt ライブラリを実装する必要があります。私が想像できる限り、「簡単な」方法はありません。

このようなものは良い出発点です:

http://gmplib.org/

于 2012-10-31T20:34:50.287 に答える