[英]Bit-masking - C++ to Python
我在我的工作中遇到了一个 C++ function 使用位掩码从 16 位无符号 integer 中提取 integer 数字。
我需要将其移植到 Python,并且不确定这些语言之间是否具有相同的语法,或者这些实现之间是否存在任何特殊差异。
我的 C++ function 是这样的:
void BitMapper(unsigned int x){
unsigned int a=0;
unsigned int b=0;
unsigned int c=0;
unsigned int aMask=0xff00;
unsigned int bMask=0x00f0;
unsigned int cMask=0x000f;
a=(x & aMask)>>8;
b=(x & bMask)>>4;
c=(x & cMask);
std::cout<< a << "\t" << "b" << "\t"<< c <<std::endl;
}
我在 Python 中非常天真地实现了它:
def BitMapper(x, aMask=0xff00, bMask=0x00f0, cMask=0x000f):
###Missing some method to cast x as unsigned 16 bit unsigned integer
a = (x & aMask)>>8
b = (x & bMask)>>4
c = (x & cMask)
print("\t {0} \t {1} \t {2}".format(a, b, c))
这个实现是否正确? 如果不是,我做错了什么,为什么?
我很清楚我以前从未遇到过位掩码,所以如果有愚蠢的错误,那是因为我已经对这里发生的事情感到困惑。
我知道我的输入格式是:
a b c
00000000 | 0000 | 0000
我假设<<
正在做位移,大概是 a 和 b 的长度由 function 定义中的位移值。 至于掩码的十六进制代码,我不知道这是什么意思。
如果有人能告诉我这个 function 到底发生了什么,我将不胜感激。
这个实现是否正确?
大概。
无论如何,您应该先对其进行测试。 如果您总是从 C++ 和 Python 实现中得到相同的结果(对于合理的输入范围,其中所有内容都适合unsigned int
),那应该会给您一些信心。
我很清楚我以前从未遇到过位掩码
因此,编写大量玩具测试,直到您了解正在发生的事情。 什么是1 & 1
? 什么是1 & 2
? 你明白为什么吗?
Python 甚至有一个解释器,只需在其中编写一堆按位和表达式并查看结果是否符合您的预期是没有成本的。
...我假设
<<
正在做一些转变
您可以在此处阅读此操作的 Python 文档和在此处阅读 C++ 文档。 所有这些东西都被记录在案并且可以搜索(一旦你知道它存在可以被搜索,并且大致知道要寻找什么)。
这个网站上还有一个非常详细的解释,我只是通过在搜索栏中输入“bitshift”找到的。
同样,您可以(并且应该)通过测试您获得的值来确认您的理解,例如。 1 << 1
、 1 << 2
,也许更相关的是0xff00 >> 8
,等等。
// 这些最初是没有类型的
唯一的问题是:C++ 不允许非类型化声明,因此这些a
、 b
、 c
可能是真正的全局变量或命名空间 scope 变量。 如果是这种情况,那么原始 function 会产生您无法复制的副作用。 找出声明a
等的位置,并确定它们是否在其他地方使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.