我有本C++定義這個C++定義了什麼?我怎樣才能用Python編寫它?
#define CSYNC_VERSION_INT(a, b, c) ((a) << 16 | (b) << 8 | (c))
我需要定義在Python一樣。這是幹什麼的?我如何在Python中做同樣的事情?
我有本C++定義這個C++定義了什麼?我怎樣才能用Python編寫它?
#define CSYNC_VERSION_INT(a, b, c) ((a) << 16 | (b) << 8 | (c))
我需要定義在Python一樣。這是幹什麼的?我如何在Python中做同樣的事情?
等效將是
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。
我想添加到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
}
在完成我的編輯之前35秒:D –
如果a,b和c是8位位域(每個位用作標誌),這可能會很有用。這將把這些位域「連接」成一個24位的位域。 – stalepretzel
從技術上講,a不必是一個字節。它可以是一個短的(2個字節)。如果a,b或c超出一個short或bytes(分別)的範圍,宏將溢出,並且預期的結果將不會與實際結果接近。 –
它是使用比特移位來存儲在單個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的衍生語言,你應該能夠使用相同的位移來完成相同的任務。
您可以在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
所以移出你需要什麼,然後只選擇最後一個字節,並將其存儲。 製作無限精度的計算器時非常有用:)
謝謝!我會接受這個答案。但是它在做什麼? –
它包含三個子組件。一個版本號到一個單一的號碼。 –