以 10 c++ 为基数显示 1024 位二进制数
Displaying 1024 bit binary number in base 10 c++
我会尽力解释我的问题。首先,这是我编写的一个程序的代码,该程序生成一个长度为 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)
我不担心哪个方向(从最小或最大的数字开始(你正在处理你的二进制文件。请相应调整(。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 密码登录程序将永远循环并显示不正确的结果
- 以 10 c++ 为基数显示 1024 位二进制数