簡體   English   中英

顯示以 10 為底的 1024 位二進制數 c++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM