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 を取得できるかということです。左シフトを使用すると、表示されている ans は 96 です。

4

3 に答える 3

2

シフトは単射ではないため、元の数値(またはその一部(実際には最後のビット))を保存せずに方法はありません。つまり、シフト後に同じになるいくつかの異なる数値があります。

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

あなたが持っている場合 1. あなたは何を手に入れようとしていますか? 2または3

于 2013-05-17T12:56:16.380 に答える
0

2 進数で表された数値を近似すると、事実上 2 で除算されます。

あなたがやっている:

99 / 2 * 2 = 24.75int.75 の部分はタイプにできないため、24 のままにします

24 * 2 * 2 = 96

バイナリで:

1100011 = 99

右に 2 シフト:

0011000 = 24

左に 2 シフト:

1100000 = 96

合計 3 の下位 2 ビットが失われました。したがって、結果の違い: 99 - 96 = 3.

ここでの本当の問題は、なぜこれを行うのかということです。おそらく、ビット操作操作を行いたくないでしょう。実数を扱うには、doubleまたは類似の型を使用します。

于 2013-05-17T13:02:38.170 に答える