[英]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 表示。 我在網上找不到類似的問題,所以我想在這里發布一個問題。 我希望我徹底描述了我的問題。
您需要大型 integer 庫的支持。 但只是其中的一小部分。 這么小的部分,我們可以一起實現它。
首先,讓我們稍微修改一下代碼以使其易於管理:
#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
是一個小值。
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;
}
};
這為我們提供了一個使用大型 integer 庫的解決方案,該庫適用於非常有限的情況。 但是對於您的用例來說已經足夠了。 如果我們測試它:
int main()
{
auto num = genArr(13);
formatNum(num);
formatNumDec(num);
}
我們得到:
1100011100011
6371(10)
或者,具有更大的值:
1101110010011010101101000111001011011010010001110000101101011000011111001011010101011111001010111011111001110100110110111101000101001111000000110000000111111000010110101100110100111001101101101111010011001100111011001101110000100010110010010101111100101110000101000110111101000101001100001110001010111110101001111101111100010110011111111111010100010110000010001000001001000010111010101100111000001000000100101010111111110100110101001111101100000100001000010011111011011100111101011011111000001111001001011011010111101101000101000101100111001000111100010001001010101110101001110001110000011101000001010010001110011110100000011111100011001010111111101010100011010000011100100110001001111110010011110001011111101111001010000000101000010100010000110101000111100001001111011110111111000100100010000011111000001111110001111011011000100101111101111111100011111001101100001011100111111011011010111111001100001110011100101001101011111011101000110001110010000010010111110101001111111111100010000110011111010010011
73868569780955456124228707899822160955495544892638015310179220061186136753214543146234756723216826639708631800432713243173835264416984333326210886331495933792989604726456910722925688428304932474264611559781633323648147423739204040611247483503242836728251464923462071095422092950093094774327508960755347(10)
我不擔心哪個方向(從您處理二進制文件的最小或最大數字開始。請相應地調整)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.