这个按位移位的反转是什么?

时间:2014-07-16 08:45:49

标签: bit-manipulation low-level

以下语句为我提供值1(当我用%d打印时)。我怎么能做到与此相反并给它1并且它返回0x1234?这可能吗?

(0x1234 & 0xF000) >> 12

5 个答案:

答案 0 :(得分:2)

(0x1FFF & 0xF000) >> 12

也会给1.所以答案是否定的,你不能回到原来的价值

答案 1 :(得分:2)

要添加到fjardon的答案,无法返回的原因是,实际上,向右移动的字节完全丢失,您无法恢复它们的值(因为它们未被存储(至少不可靠))。

在更多的数学术语中,右移函数不是单射的,因此不是双射的 - 多于一个起始值可以产生相同的结果。因此,这是单程列车。

答案 2 :(得分:1)

向右移动n位丢弃最右边的n位。左移期间也会发生同样的事情。 AND带掩码的数字也会丢弃掩码中为0的位。因此,当许多位丢失时,无法重建原始数字

答案 3 :(得分:0)

当表达式从原始值(在本例中为0x1234)中提取4位(位12到15)时,无法从表达式的结果中获取原始值。

答案 4 :(得分:0)

您的表达式将[15:12]位提取到整数的底部。其余的位将被丢弃:向右的移位将丢弃低12位。(AND也将4位范围以外的所有内容清零)。

很显然,如果您知道低位应该是什么,您可以将它们放回原位。

(v<<12) + 0x0234 = 0x1234

(如果第12位为0,则为0x0234。或者,对于任何4位0x?234,通常为v。每个十六进制数字代表二进制整数的4位。)