以 10 c++ 为基数显示 1024 位二进制数

Displaying 1024 bit binary number in base 10 c++

本文关键字:显示 1024 二进制数 c++      更新时间:2023-10-16

我会尽力解释我的问题。首先,这是我编写的一个程序的代码,该程序生成一个长度为 n 的数组,其中每个元素都是 1 或 0。下一个方法采用由第一种方法组成的数组,并将其格式化为可以打印到控制台的二进制数。

#include "bigNum.h"
#include <iostream>
#include <cstdlib>
short* genArr(int bits)
{
static short *numArr = new short[bits];
srand(time(0));
int i;
for (i = 0; i<bits; i++) {
numArr[i] = rand() % 2;
}
return numArr;
}
void formatNum(short arr[], int size) {
int i;
for (i = 0; i<size; ++i) {
std::cout<<arr[i];
}
std::cout<<"n";
}

我创建这个程序的主要原因是生成 1024 位及以上的大随机数。我不认为简单的二进制到 int 转换会起作用,因为我的二进制数的大小不是恒定的,而且它显然可以大于 64 位。

例如,如果我生成一个 1024 位二进制数,它会打印到控制台:

./test 1024
00100110110011111111000111011111001001010001110111011001100010110010110010111000101101011011000100101101110110110100001000110100110110000011010000000101110110101010011010                     01101111010001000100100100011001111110010110011101101110111011111100101110000110000011001110101011010101101110000001000111101101000010011100000010010000110001111111010110                         11101001111110011100000110111010100001010101010101101110101000111101001011110000100010010111100000000110001100110011010000100000001110100011000000001010000100111000010111                         00000000101001000100010001100000000101111011001011011111001001011000111001101000011100000100101001001001101001000110110110100101011111001100100110001010100111000111101011                         00110010000111111101101010000011000001001110010100111010001000101111010001010000111011011101011110010010001000111011100010110101110110010100110111011011110101010011011001                         10011101001010111101000100011100101011101000110000001001000110100001011101010010011111001011011010011111110110011111011100001011010101110111111100001111100101000010000001 

编辑:抱歉,我无法删除长标签。我认为这是由于复制/粘贴格式错误。

我想做的是将这个长二进制数转换为一个字符串,显示它的基数 10 表示形式。我在网上找不到类似的问题,所以我在这里发布一个问题。我希望我彻底描述了我的问题。

你需要一个大整数库的支持。但这只是其中的一小部分。这么小的部分,我们可以一起实现。

首先,让我们稍微更改一下代码以使其易于管理:

#include <iostream>
#include <cstdlib>
#include <vector>
std::vector<short> genArr(int bits)
{
std::vector<short> numArr(bits);
srand(time(0));
int i;
for (i = 0; i<bits; i++) 
{
numArr[i] = rand() % 2;
}
return numArr;
}
void formatNum(std::vector<short> arr)
{
int i;
for (i = 0; i<arr.size(); ++i) 
{
std::cout<<arr[i];
}
std::cout<<"n";
}

和以前差不多,只是使用向量。然后,你可以简单地实现非常高级的逻辑,假设你有一个大的int库:

void formatNumDec(std::vector<short> arr)
{
LargeNum n;
for(int i = 0; i < arr.size(); i++)
{
n = n * 2;
if (arr[i])
{
++n;
}
}
std::cout << n << std::endl;
}

我们所做的只是:对于每个数字,将我们的当前值乘以 2,然后根据下一个位添加零或一。

我们依靠:

  • 赋值运算符
  • 增量运算符
  • 星形运算符(用于乘法(

让我们使用它:

class LargeNum
{
public:
int base;
std::vector<int> digits;

默认情况下,我们获取赋值运算符。让我们加入一个构造函数:

LargeNum():base(10) {}

让我们通过在最后一个数字上加 1 并结转来实现增量。这仅适用于小值,但1值很小。

LargeNum& operator++()
{
int pos = 0;
bool carry = false;
do
{
carry = false;
if (pos >= digits.size())
{
digits.push_back(0);
}
digits[pos]++;
if (digits[pos] == base)
{
digits[pos] = 0;
carry = true;
}
}
while(carry);
return *this;
}

我们需要的最后一位是乘以 2。让我们通过将每个数字相乘并结转来实现乘以任何小值(例如 1 到 10(:

LargeNum& operator*(int mult)
{
int carry = 0;
for(int pos = 0; pos < digits.size(); pos++)
{
digits[pos] = digits[pos] * mult + carry;
carry = digits[pos] / 10;
digits[pos] %= 10;
}
if (carry)
{
digits.push_back(carry);
}
return *this;
}
};

这为我们提供了一个使用大整数库的解决方案,该库适用于非常有限的情况。但对于您的用例来说已经足够了。如果我们测试它:

int main()
{
auto num = genArr(13);
formatNum(num);
formatNumDec(num);
}

我们得到:

1100011100011
6371(10)

或者,使用较大的值:

1101110010011010101101000111001011011010010001110000101101011000011111001011010101011111001010111011111001110100110110111101000101001111000000110000000111111000010110101100110100111001101101101111010011001100111011001101110000100010110010010101111100101110000101000110111101000101001100001110001010111110101001111101111100010110011111111111010100010110000010001000001001000010111010101100111000001000000100101010111111110100110101001111101100000100001000010011111011011100111101011011111000001111001001011011010111101101000101000101100111001000111100010001001010101110101001110001110000011101000001010010001110011110100000011111100011001010111111101010100011010000011100100110001001111110010011110001011111101111001010000000101000010100010000110101000111100001001111011110111111000100100010000011111000001111110001111011011000100101111101111111100011111001101100001011100111111011011010111111001100001110011100101001101011111011101000110001110010000010010111110101001111111111100010000110011111010010011
73868569780955456124228707899822160955495544892638015310179220061186136753214543146234756723216826639708631800432713243173835264416984333326210886331495933792989604726456910722925688428304932474264611559781633323648147423739204040611247483503242836728251464923462071095422092950093094774327508960755347(10)

我不担心哪个方向(从最小或最大的数字开始(你正在处理你的二进制文件。请相应调整(。