从int获取几个msbs

时间:2014-05-07 08:30:49

标签: c# bit-manipulation

我试图获取11 msb位并得到它们的值:

value = lineIntData & 0xFFE00000 >> 21;

lineIntData是8个十六进制数字的数字。

我不明白为什么我收到编译错误"Cannot Implicitly convert Long to Int"。如果我从十六进制掩码中取出一个数字(从而使其成为7位数)或者如果我将int更改为long,则错误消失。

为什么我甚至会收到此错误?不是一个十六进制数字需要4位,这意味着8位是32位所以它应该都适合一个Int32?如果我做错了,那我怎么能得到数字的11个msbs的值呢?

1 个答案:

答案 0 :(得分:1)

问题是0xFFE00000的类型是uint(因为它大于0x7fffffff),并且没有&(int, uint)运算符,因此双方都被提升为{ {1}}。

修复很简单:只需移动然后掩码:

long

现在一切都始终为value = (lineIntData >> 21) & 0x7ff;

顺便说一下,我个人总是在移动和屏蔽时使用括号。这意味着我不需要记住这些运算符的优先级规则。虽然我记得一些操作符的优先级,但我只想使用括号。