我试图获取11 msb位并得到它们的值:
value = lineIntData & 0xFFE00000 >> 21;
lineIntData是8个十六进制数字的数字。
我不明白为什么我收到编译错误"Cannot Implicitly convert Long to Int"
。如果我从十六进制掩码中取出一个数字(从而使其成为7位数)或者如果我将int
更改为long
,则错误消失。
为什么我甚至会收到此错误?不是一个十六进制数字需要4位,这意味着8位是32位所以它应该都适合一个Int32?如果我做错了,那我怎么能得到数字的11个msbs的值呢?
答案 0 :(得分:1)
问题是0xFFE00000
的类型是uint
(因为它大于0x7fffffff
),并且没有&(int, uint)
运算符,因此双方都被提升为{ {1}}。
修复很简单:只需移动然后掩码:
long
现在一切都始终为value = (lineIntData >> 21) & 0x7ff;
。
顺便说一下,我个人总是在移动和屏蔽时使用括号。这意味着我不需要记住这些运算符的优先级规则。虽然我记得一些操作符的优先级,但我只想使用括号。