2013-04-05 93 views
-2

我正在使用此代码将二进制转换为十进制。但是这个代码将不能用于更多的64位,因为__int64只包含8个字节。您能否告诉我们建议一种算法来将多于64位转换为十进制值。另外我的最终结果必须是字符串。帮助表示赞赏。谢谢。C++将二进制转换为大于64位的位的十进制

int bin2dec(char *bin) 
{ 
    __int64 b, k, m, n; 
    __int64 len, sum = 0; 

    len = strlen(bin) - 1; 
    for(k = 0; k <= len; k++) 
    { 
      n = (bin[k] - '0'); // char to numeric value 
      if ((n > 1) || (n < 0)) 
      { 
        puts("\n\n ERROR! BINARY has only 1 and 0!\n"); 
        return (0); 
      } 
      for(b = 1, m = len; m > k; m--) 
      { 
        // 1 2 4 8 16 32 64 ... place-values, reversed here 
        b *= 2; 
      } 
      // sum it up 
      sum = sum + n * b; 
    } 
    return(sum); 
} 
+2

你可以使用一个BIGNUM库。 – Pubby 2013-04-05 22:42:30

+0

An *算法*?当然算法是一样的! – 2013-04-05 22:46:21

+0

[手动打印一个N字节整数]的可能的重复(http://stackoverflow.com/questions/11036198/manually-printing-an-byte-integer) – 2013-04-05 22:56:58

回答

0

通常情况下,用比你可以在一个整数单元存储更大的数据处理时,该解决方案是两件事情之一:

  1. 使用字符数组/字符串存储值“ ASCII“(在这个位中,每个字符)
  2. 在数组中使用多个整数来存储值,每个元素使用X位。

没有任何关于该转换特别的不同,只是,一旦你做了X位,就转移到下一个元素。

顺便说一句:

int bin2dec(char *bin) 
{ 
    int k, n; 
    int len; 
    __int64 sum = 0; 

    len = strlen(bin); 
    for(k = 0; k < len; k++) 
    { 
      n = (bin[k] - '0'); // char to numeric value 
      if ((n > 1) || (n < 0)) 
      { 
        puts("\n\n ERROR! BINARY has only 1 and 0!\n"); 
        return (0); 
      } 
      // sum it up 
      sum <<= 1; 
      sub += n; 
    } 
    return(sum); 
} 

是有点简单。

-1

手动:

int binaryToDec(char *bin) 
{ 
    int k, n; 
    int len=strlen(bin); 
    int dec = 0; 

    for(k = 0; k < len; k++) 
    { 
      n = (bin[k] - '0'); 
      dec <<= 1; 
      dec += n; 
    } 
    return(dec); 
} 

你也可以考虑一个bitset:

std::bitset<64> input(*bin); 
std::cout<<input.u_long(); 
+0

downvote因为? – 4pie0 2013-04-05 22:56:12

0

的算法很简单:通过保持10次幂,为了得到每间隔10秒值的分裂。诀窍是能够存储和分配大于64位数的10的幂。存储大数字的算法存在,你应该找到一个算法,尽管它们不是很难,但它们比在Stackoverflow中输入答案更合适。

但基本上,您创建一个累加器bignum,将其设置为1并开始乘以10,直到它的值大于目标bignum。然后你除以10,并启动算法:

while accum >= 1 
divide source/accum place the dividend in your output string. 
substract that number time accum from your source. 
divide accum by 10 and loop 

你认识到算法?这可能是你被教导如何在小学里进行长期分工的原因。那么,这就是你如何“打印”十进制的二进制数字。

有很多方法可以改善这种性能。 (提示,你不必以10为基数工作。对于32位整数,基10^8工作,或者对于64位整数,基10^17)。但是首先你需要一个库,它将减去,增加,多重,分割和比较。

当然,一个bignum库可能已经有一个toString函数。

0

您可以很容易地将大数字(在任何基数中)存储为数字的std::deque--使用deque可以轻松地在任一端添加数字。你可以对他们实施基本的算术运算,这可以很容易地转换成二进制使用标准的乘法为十进制并添加数字算法:

std::deque<char> &operator *=(std::deque<char> &a, unsigned b) 
{ 
    unsigned carry = 0; 
    for (auto d = a.rbegin(); d != a.rend(); d++) { 
     carry += (*d - '0') * b; 
     *d = (carry % 10) + '0'; 
     carry /= 10; } 
    while (carry > 0) { 
     a.push_front((carry % 10) + '0'); 
     carry /= 10; } 
    return a; 
} 

std::deque<char> &operator +=(std::deque<char> &a, unsigned b) 
{ 
    for (auto d = a.rbegin(); b > 0 && d != a.rend(); d++) { 
     b += (*d - '0'); 
     *d = (b % 10) + '0'; 
     b /= 10; } 
    while (b > 0) { 
     a.push_front((b % 10) + '0'); 
     b /= 10; } 
    return a; 
} 

std::string bin2dec(char *bin) { 
    std::deque<char> tmp{'0'}; 
    while (*bin) { 
     if (*bin != '0' && *bin != '1') { 
      puts("\n\n ERROR! BINARY has only 1 and 0!\n"); 
      return ""; } 
     tmp *= 2; 
     if (*bin++ == '1') 
      tmp += 1; } 
    return std::string(tmp.begin(), tmp.end()); 
} 
相关问题