2013-08-21 39 views

回答

3

等效將是

def CSYNC_VERSION_INT(a, b, c): 
    return a << 16 | b << 8 | c 

它byteshifts a由16位,向左b左8和c完好;那麼所有這些數字都一起按比例排列。因此它將a, b, c打包爲一個整數的三(四)個字節,所以最低字節是c的值,第二低字節是b,最高字節是a值。

CSYNC_VERSION_INT(3, 2, 8)等於十六進制中的0x30208或十進制中的197128。

+1

謝謝!我會接受這個答案。但是它在做什麼? –

+0

它包含三個子組件。一個版本號到一個單一的號碼。 –

1

我想添加到Antti Haapala的答案宏是什麼:它從三個字節,這是a,b和c創建一個int。

實施例:

int main() 
{ 
    unsigned int a = 0x02; 
    unsigned int b = 0xf4; 
    unsigned int c = 0x56; 
    unsigned int p = CSYNC_VERSION_INT(a, b, c); 
    // now p == 0x02f456 
} 
+0

在完成我的編輯之前35秒:D –

+0

如果a,b和c是8位位域(每個位用作標誌),這可能會很有用。這將把這些位域「連接」成一個24位的位域。 – stalepretzel

+0

從技術上講,a不必是一個字節。它可以是一個短的(2個字節)。如果a,b或c超出一個short或bytes(分別)的範圍,宏將溢出,並且預期的結果將不會與實際結果接近。 –

1

它是使用比特移位來存儲在單個int一個版本號。它將存儲高16位的「主要」版本,低16位的前8位中的「次要」版本以及最低8位中的「修訂」編號。

如果輸入過大(例如,如果a位於無符號短整數的有效範圍之外,或者b或c位於無符號字符範圍之外),它將無法正常工作。因爲它沒有類型安全,更好的方法是使內聯函數,它與適當類型的相同操作:

inline unsigned long MakeVersion(unsigned short major, unsigned char minor, unsigned char revision) 
{ 
    unsigned long l = (static_cast<unsigned long>(major) << 16) | (static_cast<unsigned long>(minor) << 8) | (static_cast<unsigned long>(revision); 
    return l; 
} 

因爲Python是C的衍生語言,你應該能夠使用相同的位移來完成相同的任務。

1

您可以在Python具有相同含義

res = ((a) << 16 | (b) << 8 | (c)) 

寫這個假設你有1B數據類型(如字符),並希望將所有的數據存儲在更大的數據類型(> = 3B),你有使用這種轉變,所以對於

a = 01001110 
b = 11010001 
c = 00100011 

res= 01001110 11010001 00100011 

(轉儲,所有二進制)

'<<' this means bitwise shift (left) 
'|' this means bitwise or (logic or for every bit) 

您也可以使用相反的態度,使A,B,C從資源

a = (res >> 16) & 0xFF 
b = (res >> 8) & 0xFF 
c = res & 0xFF 

所以移出你需要什麼,然後只選擇最後一個字節,並將其存儲。 製作無限精度的計算器時非常有用:)