2014-03-29 57 views
-4

給定一個16位數的整數。我必須在C++中使用位操作或任何其他方法來打印它的方格。我嘗試將該數字作爲long int使用,但它不起作用範圍long int小於期望的輸入。一個非常大的數字的方塊

+0

嘗試將其轉換爲float:'double d =(double)i'?然後位操作會更棘手,但是有很多材料。否則,如果你使用gcc,你可以使用[128位整數](http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html)。 – Jens

+0

如果你需要很多空間,你總是可以使用'long long i = d * d' –

+1

如果這還不夠,請使用兩個128b整數並手動將這些比特從一個轉移到另一個。看看類似的問題,像[這一個](http://stackoverflow.com/questions/193398/multiplication-of-very-long-integers)。 – Jens

回答

0

廣場是一個無符號整數(32位)完全可表示:

#include <iostream> 
#include <cstdint> 

int main() 
{ 
    std::int32_t s = (std::int32_t(1) << 16) - 1; 
    std::uint32_t u = std::abs(s); 
    std::uint32_t square = u * u; 
    std::cout << square << " = " << std::hex << square << '\n'; 
    return 0; 
} 

擁有一個有符號整數,你將面臨溢出,並得到一個負數。

+2

我不認爲他的意思是16位整數。我認爲他的意思是16位十進制數字(我自己有點不確定)。 – Jens

+1

「abs」的含義是什麼?什麼是這個簽名的16位數字,其平方不適合int32_t? –

+0

確實@Jens我在找十六進制數字。 –

2

您可以隨時選擇更大的原始數據類型,但通常這隻會延遲問題。一旦你想採取長期的平方,你應該做什麼?

如果你需要真正的大數字,你需要一個更抽象的封裝數據表示。 C++有適合這項工作的工具,Boost庫通過Boost.Multiprecision廣泛使用它們。具體而言,請查看<boost/multiprecision/cpp_int.hpp>的文檔。它很複雜,但功能強大。