1
 #include<iostream>
 #include<stdio.h>
 using namespace std;
 int main()
 {
     int n=99;
     int shift=n>>2;
     cout<<shift;
     shift=shift<<2;
     cout<<shift;
 }

上面的结果给出了“unsignedShift=24”。问题是如果给出 24,我怎样才能取回原始值,即n99。当我使用左移时,它显示的答案是 96。如何处理负数

4

3 回答 3

2

没有办法不存储原始数字(或其部分(实际上是最后一位)),因为移位不是单的,即有一些不同的数字在移位后变得相同。

3>>1 // = 1;
2>>1 // = 1;

如果你有 1. 你会得到什么?2 或 3

于 2013-05-17T12:56:16.380 回答
0

变换二进制表示的数字实际上是除以 2。

你正在做:

99 / 2 * 2 = 24.75.75 部分不能是这样的int类型,所以留下 24

24 * 2 * 2 = 96

二进制:

1100011 = 99

向右移动两位:

0011000 = 24

向左移动两位:

1100000 = 96

您丢失了总计 3 的低两位。因此结果的差异:99 - 96 = 3。

这里真正的问题是您为什么要这样做 - 您可能不想进行位操作操作。使用实数使用double或类似类型。

于 2013-05-17T13:02:38.170 回答
0

当您右移 2 位时,您丢失了最后 2 位......当您再次左移时,它们被 00 替换

你可以这样做

保持 2 位为

bits_to_be_lost = n & ((0x1<<2) - 1)

然后你的代码

检索它必须是

n<<2 | bits_to_be_lost

于 2013-05-17T13:03:32.003 回答