gcc
4.4似乎是當他們添加int128_t
時,我需要使用位移,並且我已經用完了一些位域。有什麼辦法可以在gcc上執行128位整數<4.4
編輯:這可能是因爲我的32位計算機上,有沒有辦法把它的32位計算機(英特爾凌動),是嗎?我不在乎它是否會產生棘手的慢速機器代碼,如果我按照預期的方式按位移動工作的話。
gcc
4.4似乎是當他們添加int128_t
時,我需要使用位移,並且我已經用完了一些位域。有什麼辦法可以在gcc上執行128位整數<4.4
編輯:這可能是因爲我的32位計算機上,有沒有辦法把它的32位計算機(英特爾凌動),是嗎?我不在乎它是否會產生棘手的慢速機器代碼,如果我按照預期的方式按位移動工作的話。
您可以使用兩個64位整數,但您需要跟蹤其間的位移。
我很確定__int128_t
在早期版本的gcc上可用。剛剛檢查了4.2.1和FreeBSD,並且sizeof(__int128_t)
給出了16.
您也可以使用庫。這將具有便攜性(關於平臺和編譯器)的優點,您可以輕鬆切換到更大的數據類型。我可以推薦的一個是gmp(即使它的意圖不是處理bitwidth x,而是像你想要的那樣變大)。
任意位數的位移很容易。只要記住把溢出的位移到下一個分支。這是所有
typedef struct {
int64_t high;
uint64_t low;
} int128_t;
int128_t shift_left(int128_t v, unsigned shiftcount)
{
int128_t result;
result.high = (v.high << shiftcount) | (v.low >> (64 - shiftcount));
result.low = v.low << shiftcount;
return result;
}
類似的右移
int128_t shift_right(int128_t v, unsigned shiftcount)
{
int128_t result;
result.low = (v.low >> shiftcount) | (v.high << (64 - shiftcount));
result.high = v.high >> shiftcount;
return result;
}
這似乎並不與之前的GCC 4.1.2工作(如在RHEL 5) – 2013-08-20 18:49:18