2011-04-07 65 views
8

gcc 4.4似乎是當他們添加int128_t時,我需要使用位移,並且我已經用完了一些位域。有什麼辦法可以在gcc上執行128位整數<4.4

編輯:這可能是因爲我的32位計算機上,有沒有辦法把它的32位計算機(英特爾凌動),是嗎?我不在乎它是否會產生棘手的慢速機器代碼,如果我按照預期的方式按位移動工作的話。

回答

1

您可以使用兩個64位整數,但您需要跟蹤其間的位移。

8

我很確定__int128_t在早期版本的gcc上可用。剛剛檢查了4.2.1和FreeBSD,並且sizeof(__int128_t)給出了16.

+0

這似乎並不與之前的GCC 4.1.2工作(如在RHEL 5) – 2013-08-20 18:49:18

4

您也可以使用庫。這將具有便攜性(關於平臺和編譯器)的優點,您可以輕鬆切換到更大的數據類型。我可以推薦的一個是gmp(即使它的意圖不是處理bitwidth x,而是像你想要的那樣變大)。

2

任意位數的位移很容易。只要記住把溢出的位移到下一個分支。這是所有

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; 
} 
相關問題