2011-05-25 65 views
0

我有一個uint128_t類,它的值存儲爲uint64_t UPPER, LOWER;,我不知道如何超載operator<<,以便當我通過std::cout時,該值將以十進制正確打印。目前,我只是在做正確打印出2個部分的整數

std::ostream & operator<<(std::ostream & stream, uint128_t const & rhs){ 
    if (rhs.upper())     // if the upper value has a non-zero digit 
     stream << rhs.upper(); 

    // i need some way to pad this so that the number of 0s between 
    // upper and lower is correct 

    stream << rhs.lower(); 
    return stream; 

我該怎麼辦?

編輯:

例如:

如果uint128_t變量UPPER = 1LOWER = 1,我想流包含的(1 << 64) + 1

+0

所以,如果'upper'是1和'lower'是2,它應該是什麼打印? 100,000,000,000,000,000,002?或18,446,744,073,709,551,618? – Beta 2011-05-25 20:45:47

+0

我想我應該打印18,446,744,073,709,551,618,因爲'UPPER'中的十進制是'1 << 64' – calccrypto 2011-05-25 20:51:55

回答

1

十進制值假設你有你的除法運算符和你的模運算正確實施,你可以這樣做:

std::ostream & operator<<(std::ostream & stream, uint128_t const & rhs){ 

    if(rhs.upper() == 0) 
     return stream << rhs.lower(); 

    char buffer[50]; 
    char *cp = buffer + 49; 
    *cp = 0; 
    while(rhs > 0) 
    { 
     --cp; 
     *cp = (rhs % 10) + '0'; 
     rhs /= 10; 
    } 

    return stream << cp; 
} 
+0

這個分割和模式操作將成爲我的下一個問題:( – calccrypto 2011-05-25 20:52:22

+3

@calccrypto:那麼,你應該先實現那些。 – 2011-05-25 20:53:16