以下语句为我提供值1(当我用%d
打印时)。我怎么能做到与此相反并给它1并且它返回0x1234?这可能吗?
(0x1234 & 0xF000) >> 12
答案 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位。)>