0

私はビットシフトに取り組んでおり、この問題に遭遇しました。
私は2つのintを持っています:

int x = 1;
int y = 2;

違いは何ですか:

 x = x << (31 + 1);

 y = y << 31;

私は結果が同じになると思っていました (つまり、x と y の両方が 1 に等しい) が、そうではありません...理由がわかりません。2 は、「1」ビットが 1 スペース左に移動した 1 です。

ありがとう!

つまり、シフトレフトができなくなったら、先頭に戻りませんか?

編集:何が起こっていると思うかを明確にしましょう:

x = 1 から始めるので、次のようになります。

 00000000 00000000 00000000 00000001

次に、それを 31 +1 (または 32) 左にシフトします。これにより、次のことがわかります。

 00000000 00000000 00000000 00000001

これも 1 です。

次に、y = 2 を実行します。

 00000000 00000000 00000000 00000010

シフトを 31 残しました。これにより、次の結果も得られます。

 00000000 00000000 00000000 00000001

したがって、x = y = 1 となります。これが間違っていることはわかっていますが、その理由を説明できる人はいますか?

4

3 に答える 3

1

あなたは回転とシフトを混同しています:

  • シフトとは、すべてのビットをシフトし、空のスポットを0または1で埋めることを意味します(値や符号に応じて)。

  • 回転とは、すべてのビットをシフトし、最終的に「落ちた」ビットで空の場所を埋めることです。

AFAIK Cは回転をサポートしていませんが、シフトのみをサポートしています(おそらくプラットフォームの依存関係のためですか?)。x86アセンブラは、シフト操作と回転操作の両方を実装します。

私がここで与えることができるよりも良い説明は、ここで見つけることができます:http: //en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate

于 2012-10-13T18:02:13.793 に答える
0

H2CO3で述べたように、動作は定義されていません。詳細については、 C996.5.7を参照してください。また、この質問は、あなたの質問と同じではないにしても、非常に似ています。あなたもそこにいくつかの良い情報を見つけるかもしれません。

ちなみに、私のシステムはシフトを32だけ変更します。

于 2012-10-13T18:02:13.683 に答える
0

もう左にシフトできないときは、最初に回り込みませんか?

いいえ。その動作は循環シフトと呼ばれ、Cでのシフト演算子の動作とは異なります

(ちなみに、私にとっては、どちらの式ものように0になりますprintf("%d %d\n", 1 << (31 + 1), 2 << 31);が、符号付き整数のオーバーフローは未定義の動作であるため、これはあまり意味がありません。)

于 2012-10-13T17:46:37.343 に答える