1

我有这个 C++ 定义

#define CSYNC_VERSION_INT(a, b, c) ((a) << 16 | (b) << 8 | (c))

我需要在 Python 中定义相同的内容。这是在做什么?我怎样才能在 Python 中做同样的事情?

4

4 回答 4

3

等价的将是

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。

于 2013-08-21T17:44:21.603 回答
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
}
于 2013-08-21T17:48:51.570 回答
1

它使用位移将版本号存储在单个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 派生语言,因此您应该能够使用相同的位移来完成相同的任务。

于 2013-08-21T17:49:46.093 回答
1

你可以用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

因此,移出您需要的内容,然后仅选择最后一个字节并存储它。在制作具有无限精度的计算器时非常有用:)

于 2013-08-21T17:50:11.997 回答