簡體   English   中英

將數字的八進制表示轉換為十進制

[英]Convert octal representation of a number to decimal

假設一個向量或N個元素的數組(N可以非常大)包含非負整數的八進制表示。 如何從此數組中獲取數字的十進制表示形式? 代碼必須非常快。

編輯:N個元素的數組A包含一個非負整數K的八進制表示,即A的每個元素都屬於區間[0; 7](包括兩端)

例如:A [0] = 2; A [1] = 6; A [2] = 3

現在天真的計算將是2 * 8pow0 + 6 * 8pow1 + 3 * 8pow2 = 2+ 48+ 192 = 242

我嘗試了這個,但對於輸入> 6K的大型輸入似乎不起作用

//vector<int> A is the input
using namespace std;
vector<int>::iterator it = A.begin();

unsigned int k = 0;
unsigned int x = 0;
while(it < A.end()){
   x = x | (*it<<3*k);
   k++;
   it++;
}

我也遇到了將十六進制字符串轉換為其十進制表示形式的問題? 這是在C ++中執行此操作的正確方法嗎://假設S為包含十六進制表示形式的輸入字符串//像F23

std::stringstream ss;
ss << std::hex << S;
ss >> x;

精度從八進制到十進制的Arbitray轉換相當煩人,因為無法本地化計算。 換句話說,八進制數的最高有效位的變化甚至會改變十進制表示中的最低有效位。

就是說,我認為我可以將八進制數轉換為以base-1000000000為基數的數字,然后打印出來(這是一個瑣碎的問題,每個base-1000000000位數字都只是微不足道地映射到9位base-10位數字)。

轉換為base-1000000000很簡單,因為您只需要支持遞增和乘以2(只需將輸入視為二進制,每個八位數字為3位)即可。

編輯

我試圖在C ++中實現它,這是結果代碼

#include <stdio.h>
#include <vector>

int main(int argc, const char *argv[]) {
    // Base 100,000,000 accumulator
    // Initialized with one digit = 0
    std::vector<unsigned> big(1);
    const unsigned DIGIT = 100000000;

    for (int c=getchar(); c >= '0' && c <= '7'; c=getchar()) {
        // Multiply accumulator by 8 and add in incoming digit
        int carry = c - '0';
        for (int i=0,n=big.size(); i<n; i++) {
            unsigned x = big[i] * 8 + carry;
            carry = x / DIGIT;
            big[i] = x - carry * DIGIT;
        }
        if (carry) big.push_back(carry);
    }

    // Output result in decimal
    printf("%i", big.back());
    for (int i=int(big.size())-2; i>=0; i--) {
        printf("%08i", big[i]);
    }
    putchar('\n');
    return 0;
}

在我的PC上,將80,000位數的八進制數字轉換為十進制(產生72246位數)的時間約為1.2秒。 使用python eval / str進行相同的操作大約需要3秒鍾。 使用的數字為"01234567" * 10000

上面的代碼使用100,000,000作為基數,因此它一次可以用32位算術處理一位數(3位),而中間結果不會溢出。 我也嘗試使用64位整數或double的53位整數部分,但是代碼的運行速度總是比這種情況慢(一個原因可能是內部循環中的除法可以在32位情況下轉換為乘法) )。

這仍然是一個簡單的O(n ^ 2)實現,需要很長時間才能轉換10,000,000位八進制數。

這是我想出的:

template<typename Iter>
int read_octal(Iter begin, Iter end)
{
    int x = 0;
    int f = 1;
    for (; begin != end; ++begin)
    {
        x += *begin * f;
        f *= 8;
    }
    return x;
}

int main()
{
    int test[] = {2, 6, 3};
    int result = read_octal(test + 0, test + 3);
    std::cout << result << '\n';
}

我嘗試了這個,但對於輸入> 6K的大型輸入似乎不起作用

6k到底是什么意思? 一個int通常具有32位,而一個八進制數字則具有3位。 因此,范圍內的元素不能超過10個,否則x會溢出。

我也遇到了將十六進制字符串轉換為其十進制表示形式的問題?

好吧,您總是可以自己編寫一個函數來解析十六進制格式的字符串:

int parse_hex(const char* p)
{
    int x = 0;
    for (; *p; ++p)
    {
        x = x * 16 + digit_value(*p);
    }
    return x;
}

最易攜帶的digit_value版本為:

int digit_value(char c)
{
    switch (c)
    {
        case '0': return 0;
        case '1': return 1;
        case '2': return 2;
        case '3': return 3;
        case '4': return 4;
        case '5': return 5;
        case '6': return 6;
        case '7': return 7;
        case '8': return 8;
        case '9': return 9;
        case 'A': 
        case 'a': return 10;
        case 'B': 
        case 'b': return 11;
        case 'C': 
        case 'c': return 12;
        case 'D': 
        case 'd': return 13;
        case 'E': 
        case 'e': return 14;
        case 'F': 
        case 'f': return 15;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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