3

重複の可能性:
C# で Shift 演算子 << >> を使用するタイミングは?

私はしばらくプログラミングをしていましたが、シフト演算子を使用したことはありません。のようにハッシュコードを計算するのに役立つことがわかりましたTuple<T>が、それ以外は、

C#/.NET でシフト演算子が役立つのはいつ、どのような場合ですか?

4

7 に答える 7

13

一般的には、あまり使用されません。ただし、ビット レベルの操作を扱う場合は非常に便利です。たとえば、数値のビットを出力する

public static string GetBits(int value) {
  var builder = new StringBuilder();
  for (int i = 0; i < 32; i++) {
    var test = 1 << (31 - i);    
    var isSet = 0 != (test & value);
    builder.Append(isSet ? '1' : '0');
  }
  return builder.ToString();
}
于 2011-05-03T22:15:13.040 に答える
10

2 の累乗を書くと便利です。

クイック: 2 27とは?
答え:1 << 27

書く1 << 27ことは、よりも簡単で理解しやすいです134217728

于 2011-05-03T22:12:29.387 に答える
3

私はハードウェアを扱う際にかなり頻繁に使用します。これはおそらくC#で頻繁に行うことではありませんが、演算子はC / C ++から継承されており、かなり一般的なニーズです。

例1:

リトルエンディアンのマシンからロングワードを受け取ったばかりですが、私はビッグエンディアンです。どうすれば変換できますか?まあ、明らかなのは呼び出しhtonl()です(あなたは詐欺師です)。それを手動で行う方法の1つは、次のようなものを使用することです。

        ((source & 0x000000ff) << 24 ) |
        ((source & 0x0000ff00) << 8) |
        ((source & 0x00ff0000) >> 8) |
        ((source & 0xff000000) >> 24);

例2:

最大512Kのロングワードアクセスのみを許可するDMAデバイスがあります。したがって、(ハードウェア関係者だけが理解できる理由で)転送サイズのモジュロ4をDMA転送制御レジスタの上位18ビットに入れる必要があります。議論のために、下位ビットはDMA動作を制御するさまざまなフラグで埋められます。それは次のように達成されます:

dma_flags | ((length & 0xffffc) << 14);

これらはあなたが毎日するようなことではないかもしれません。しかし、定期的にハードウェアに接続している私たちにとってはそうです。

于 2011-05-03T22:47:07.617 に答える
2

* を使用せずに乗算する必要がある場合は、.NET で乗算演算子を使用せずに乗算を実装する方法:)

または、数独ソルバー数独有効性チェック アルゴリズムを作成します。このコードはどのように機能しますか?

実際には、私の(限られた)経験で使用されたのは、(おそらく)紛らわしい乗算方法(最初のリンクを参照)として、または BitFlags の設定(上記の数独ソルバー)と組み合わせて使用​​されたときだけでした。

.NET では、ビット レベルで作業する必要はほとんどありません。ただし、必要に応じて、シフトできることが重要です。

于 2011-05-03T22:17:39.073 に答える
2

ビット演算子はスペースを節約するのに適していますが、最近ではスペースはほとんど問題になりません。

2 の累乗を掛けるときに便利です。

number<<power;

number*2^power

もちろん、2 のべき乗による除算:

number>>power;

別の場所は、列挙型のフラグです。

のようなコードに出くわしたとき

Regex re = new Regex(".",RegexOptions.Multiline|RegexOptions.Singleline);

つまり、複数のフラグを使用する機能RegexOptions.Multiline|RegexOptions.Singlelineは、シフトによって有効になり、これによりそれらを一意にすることができます。

何かのようなもの:

enum RegexOptions {
  Multiline  = (1 << 0), 
  Singleline = (1<<1)
};
于 2011-05-03T22:18:45.777 に答える
0

個々のビットを操作する必要がある場合は、ビット シフトが使用されます。たとえば、多くの暗号化アルゴリズムでは多くのビット シフトが見られます。

最適化では、乗算/除算の代わりに使用できます。左シフトは、2 倍することと同じです。右シフトは除算に等しい。このレベルの最適化は不要な場合が多いため、おそらくこれが行われることはもうありません。

それ以外に、それを使用する多くの理由は考えられません。以前に使用されたのを見たことがありますが、本当に必要な場合はめったになく、通常はより読みやすい方法を使用できました。

于 2011-05-03T22:19:07.050 に答える
0

2倍する必要があるときはいつでも;)

本当に私が持っている唯一の用途は、相互運用コードとビットフィールドです。

http://www.codeproject.com/KB/cs/masksandflags.aspx

于 2011-05-03T22:20:09.117 に答える