2017-03-12 8 views
0

同じシフト数の2つの異なる結果を見たので、私はこのすべてのシフトのことで混乱しました。私はこのことについてたくさんの質問があることを知っていますが、私はまだ私が探していたものを見つけることができなかったようです(質問やウェブサイトを助けることができるリンクを投稿してください)。{2の補数}ビットシフト

最初に、数字13のようなバイナリが表示されています:001101(ビットの全ワードではありません)。 2によって左にシフトすると、最後のビット(おそらく符号のビット)が保持され、結果は0|10100 = 20のようになります。しかし、他の場所では、番号1301101のようになり、現在01101<<20|0100 = 4でした。私は左にシフトすることはベースで乗算することと同じですが、これは私を混乱させました。 13001101または01101とし、シフトを適用する必要があります。 結果を考慮してオーバーフローを省略したと思います。

ありがとうございました!

答えて

0

この動作は、長さ5および 4(符号ビットをカウントしないビット)の整数に対応しているようです。だから、オーバーフローが本当に問題だと思われます。そうでない場合、これらの奇妙な結果がどこで発生するかについていくつかのコンテキストを追加できますか?

0

00110101101とも110100001101と他のサイズは13あなたは本当に13とすることができる(むしろそれは、サイズが操作され、1決定的な大きさを持っていることを言うことができない「中」に等しい主張を持っています無限大、左シフトは決してラップしない)。

シフトする値とは無関係に、シフトのサイズを決めなければなりません。一般的な選択肢は32ビットまたは64ビットですが、これに限定されるものではありませんが、「奇妙な」サイズは一般的なマシンや一般的なプログラミング言語で実装するためにより多くの努力を要します。

途中で記号が意図的に左シフトに保持されることはありません。これを行うには便利な方法はありません。強制的に保持するということは、通常のラップをモジュロ2の累乗ではなくそれは素敵なプロパティを持っています)。

+0

はい、私はあなたが言っていることを理解しています。しかし、新しいタイプを定義しない限り、 '13 - 001101'(6ビット)をシフトして' << 3'でシフトしたいとすると、結果は '001000'または' 101000' –

+0

@MathNewbie '101000'になります。 – harold

+0

このようなシフトには、プロパティ '(a + b)<< k ==()を持たないでしょう。 a << k)+(b << k)例えば – harold