我有这个 C++ 定义
#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
它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
}
它使用位移将版本号存储在单个int
. 它将“主要”版本存储在高 16 位中,“次要”版本存储在低 16 位的前 8 位中,“修订”号存储在最低 8 位中。
如果输入太大(例如,如果 a 超出 unsigned short 的有效范围,或者 b 或 c 超出 unsigned char 的范围),它将无法正常工作。由于它没有类型安全,更好的方法是创建一个内联函数,使用适当的类型执行相同的操作:
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 数据类型(如 char)并且您想将所有数据存储为更大的数据类型(>= 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)
你也可以用相反的态度,从 res 做 a, b, c
a = (res >> 16) & 0xFF
b = (res >> 8) & 0xFF
c = res & 0xFF
因此,移出您需要的内容,然后仅选择最后一个字节并存储它。在制作具有无限精度的计算器时非常有用:)