这个C ++定义的是什么?我怎么能用Python编写它?

时间:2013-08-21 17:41:26

标签: c++ python

我有这个C ++定义

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

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

4 个答案:

答案 0 :(得分:3)

等价物是

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

它将a向左移位16位,b向左移动8,c完整;那么所有这些数字都是按位串联的。因此它将a, b, c打包成一个整数的三(4)个字节,因此最低字节是c的值,第二个最低字节是b,最顶端的字节是a {1}}值。

CSYNC_VERSION_INT(3, 2, 8)等于十六进制的0x30208或十进制的197128。

答案 1 :(得分:1)

我想在Antti Haapala的回答中添加宏的功能:它从三个字节创建一个int,即a,b和c。

示例:

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
}

答案 2 :(得分: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派生语言,因此您应该能够使用相同的位移来完成相同的任务。

答案 3 :(得分:1)

你可以在python中用相同的含义写这个

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

假设您有1B数据类型(如char),并且您希望将所有数据存储在更大的数据类型(&gt; = 3B)中,则您已使用此移位,因此对于

a = 01001110
b = 11010001
c = 00100011

将是

res= 01001110 11010001 00100011

(dump,all in binary)

'<<' 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

然后移出你需要的东西,然后只选择最后一个字节并存储它。 在制作具有无限精度的计算器时非常有用:)