我有这个C ++定义
#define CSYNC_VERSION_INT(a, b, c) ((a) << 16 | (b) << 8 | (c))
我需要在Python中定义相同的内容。这是做什么的?我怎样才能在Python中做同样的事情?
答案 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,ca = (res >> 16) & 0xFF
b = (res >> 8) & 0xFF
c = res & 0xFF
然后移出你需要的东西,然后只选择最后一个字节并存储它。 在制作具有无限精度的计算器时非常有用:)