gpt4 book ai didi

c++ - 在Base 10 C++中显示1024位二进制数

转载 作者:行者123 更新时间:2023-12-02 10:02:15 24 4
gpt4 key购买 nike

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

#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";
}

和以前几乎一样,只是使用 vector 。然后,假设您有一个大的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是较小的值。
        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)

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

    关于c++ - 在Base 10 C++中显示1024位二进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62053899/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com