2

可能重复:
将 1 和 0 的字符串转换为二进制值

假设我有一个包含 1024 个字符(代表 0 和 1)的字符串。我想将它表示为以十进制为基数的数字(也作为字符串)。棘手的部分是我必须在没有第三部分库的情况下在 C/C++ 中完成。有什么线索吗?

4

3 回答 3

5

可能有更有效的方法,但我有一个十进制数字数组,并在其上实现一个“左移”函数,该函数从最低有效数字开始,将它们加倍并延续到下一个数字。

然后,只需一次读取一位二进制数据并“左移”十进制数组并根据需要在二进制数字中“或”运算。

只需遍历十进制数字即可打印出答案。

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[32] (或 long number[16],你有什么),而不是只有一个 int number。

边界的数学很烦人,但并非不可能。如果您无法弄清楚,请告诉我。

这对我有用。大于 (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 位数字表示为十进制。您可以获得的最接近的是浮点近似值。

编辑:

一个念头产生。将数字放在堆栈中并以这种方式计数。不过,仍然必须弄清楚如何将它们加在一起。如果你想这样做,你将不得不实现你自己的 BigInt 库,据我所知,没有一种“微不足道”的方式。

这样的事情是一个很好的起点:

http://gmplib.org/

于 2012-10-31T20:34:50.287 回答