5

整数乗算(除算を一時的に忘れる)の違いはまだシフトを支持していますか?もしそうなら、違いはどれくらいですか?

ほとんどの場合、(C#/ Java)バイトコードコンパイラまたはjitがそれをキャッチするべきではない場合でも、それは単にそのような低レベルの最適化のように思えますか?

注: C# (gmcs Mono C# コンパイラ バージョン 2.6.7.0 を使用) のコンパイル済み出力をテストしましたが、乗算の例では、2 の倍数で乗算する場合でも、乗算にシフトを使用しませんでした。

C# http://csharp.pastebin.com/hcrRnPrb

cil http://csharp.pastebin.com/0js9F2c1

PS私はそれをバイトで使用するといくらか便利かもしれないことを忘れていましたが、数値で使用するにはまだ問題があります。

4

8 に答える 8

22

最初の理由:

場合によっては、ほとんどの場合、整数を数値として扱いたいことがあります。ただし、ビットのセットを表すには整数が便利な場合もあります。

掛け算は数に対する演算です。

シフトは、一連のビットに対する操作です。

たまたま乗算の結果とシフトの結果との間に関係があることは特に関係ありません。操作は論理的に異なります。

2 番目の理由:

C# と Java はどちらも、表面的なレベルではありますが、C 開発者になじみやすいように設計されています。そのため、C の一般的なイディオムが C# と Java に組み込まれました。

于 2010-10-01T05:02:35.377 に答える
12

数値を 4 倍したい場合は、 と書き* 4ます。私の意図がいくつかのビットを2桁左シフトすることである場合、私は書くでしょう<< 2.

質問について:

Java と C# にビットシフト演算子があるのはなぜですか?

私はバイナリデータで多くの作業を行っていますが、整数などについては考えていません-バイナリだけです-その領域では、シフト演算子を常に使用することは完全に論理的です。

もちろん、etc と入力することもできますが、実際にやりたいのはビットをシフトすることです。* 2

これは、バイトが重要な範囲の領域 (グラフィックス プログラミング、シリアライゼーションなど) で一般的です。

さらに、特にエッジを扱うときに、整数のように動作させたくないシフト操作の微妙な点がいくつかあります...マップから少し左にシフトしたとき、または右にシフトしたときに何が起こるかのルールマップの-shift ビット(-ve と +ve など) はよく理解されていますが、重要です。同様に、整数乗算の/の動作は非常に重要な場合があります。checkedunckecked

于 2010-10-01T05:24:08.623 に答える
8

そうです、シフト演算子が乗算の代替手段としてのみ使用される場合は、コンパイラに任せるべきです。

次のようなアプリケーションを見落としていたと思います。

  • 暗号化・復号化
  • CRC計算
  • ビットマップ操作 (グラフィックス、データベース ロック)
  • 圧縮・解凍
  • ハードウェア レジスタのデータの設定
  • エンコーディングを変更する

ネイティブ コードを使用せずに効率的に実装するには、さらに多くのことを少しいじる必要があります。

于 2010-10-01T05:47:37.880 に答える
1

あなたが求めているのは、本質的に、C#/Java にビットシフト演算子がある理由ではなく、javacコンパイラが 2 の累乗の乗算と除算をビットシフトに最適化しない理由です。

これに対するお決まりの反応は、乗算と除算はビットシフトとは異なるセマンティクスを持っているため、演算を置き換えるために 100% をマップするわけではないということです。

また、あらゆる種類の追加の最適化が行われる JIT (HotSpot) で発生する追加のコンパイル手順を忘れていました。率直に言って、この特定のステップを最適化する必要はありません。コンパイラーがコードを生成する C とは対照的です。

于 2010-10-01T05:58:24.440 に答える
0

ビットを左右にシフトできるようにします。これらのビットとそのシフト操作で何を表現するかは、完全にあなた次第です。

于 2010-10-01T06:12:11.650 に答える
0

ここでの他の理由に加えて、ネットワークを介してサードパーティのライブラリまたはリモートアプリケーションとインターフェイスするためにシフト(または他のビット演算)が必要になる場合がたくさんあります。

于 2010-10-01T06:14:08.090 に答える
0

言語設計者は、それらがあれば良いと考えたからです。

それらが他の操作と同等であること、およびコンパイラーが操作を効率的に実装するのに十分スマートであることは、それほど重要ではありません。それが私たちの目的である場合、おそらくガベージ コレクターを備えた VM 上で、マクロ アセンブラーと非常に優れたリンク時間オプティマイザー以上のものは必要ありません。これらは、言語設計者が通常追求する目標ではありません。

于 2010-10-01T05:56:35.940 に答える
0

たとえば、プログラムでビット マスクのようなものを使用する場合があります。その場合、ビットシフト操作が必要です。または、指定された方法で状態をエンコードする必要がある奇妙なタスクを解決している場合。

このチュートリアルを見てください- ほとんどのサンプルは数学の問題から来ています. 単にサイトや GUI アプリケーションを作成している場合は、おそらく移行する必要はありませんが、実際に移行する必要がある場合もあります...

于 2010-10-01T06:04:14.320 に答える