2

最近、Javaでシフト演算子を使用しましたが、演算子がC>>と同じ意味を持たないことに気付きました。Javaでは、最初のビットを同じ値に保つ符号付きシフトです。Javaでは、Cシフトに相当するのは演算子です。左シフト演算子()はCと同じで、最初のビットを無視してシフトします。>>>>>>><<

私が疑問に思ったことは

  • なぜこの変更を行うのですか?
  • 表記が一貫していないのに、>>と<<は符号付きシフトであり、>>>と<<<は符号なしであるのはなぜですか?
  • 符号付きシフト演算子の用途はありますか?
4

3 に答える 3

2

2:s の補数表現では符号が最上位ビットに格納されるため、符号を意識した左シフトは必要ありません。

ある種の「署名認識」方法で左に 1 ビットシフトされた値の間に違いはありません。別の方法でできることは何もありません。ビットを左にシフトし、最下位ビットに 0 を挿入すれば完了です。

符号付きの数値では、右へのシフトはそれほど明確ではありません。そのため、演算子が 2 つあります

于 2012-03-15T15:32:52.977 に答える
2

私が知る限り、 Java では>>andの意味>>>は常に同じです。

この変更を行う理由

マシンの独立性。の意味は>>、C の実装に多少依存します。

于 2012-03-15T15:34:25.113 に答える
1

符号付き左シフトと符号なし左シフトはまったく同じであるため、別の演算子を用意する必要はありません。

一方、Java には unsigned 型がないため、どのシフトを使用するかを型に依存することはできません。

参考までに、逆に持っていると思います-符号付き右>>シフト、>>>符号なし右シフトです。

于 2012-03-15T15:32:40.447 に答える