2014-05-07 22 views
0

我试图把11个MSB位,并得到他们的价值是这样的:拿几个最高位从int

value = lineIntData & 0xFFE00000 >> 21; 

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

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

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

+0

尝试'unsigned int'而不是'int' – Dialecticus

+0

Jon Skeet是这里的专家(* C *的专家),所以他的解决方案最有可能比我所能达到的更准确。我并不确定演员的位置,因此写在评论中而不是答案中。 – Dialecticus

回答

1

的问题是,0xFFE00000类型是uint(因为它比0x7fffffff更大),而且也没有&(int, uint)运营商,因此双方都提升到long

修复的方法是简单:只是转移和然后面膜:

value = (lineIntData >> 21) & 0x7ff; 

现在一切都保持一个int贯穿始终。

顺便说一句,我个人总是移位和掩蔽时使用括号。这意味着我不需要记住这些运营商的优先规则。虽然我记得一些运营商的优先级,但这是一种情况,我宁愿只使用括号。

+0

阅读csharpindepth ... –

+0

@Jon Skeet我拿MSB的方式如何?我不能在没有按位的情况下进行转换吗?因为它只是将我需要的一切转移到开始,并将所有0都给我? –

+0

@YonatanNir:如果这是一个“int”,则不会 - 如果原始值的最高位已设置,则该移位将填充1而不是0。如果你使用'uint'开始,你只需要转移。 –