私はしばらくプログラミングをしていましたが、シフト演算子を使用したことはありません。のようにハッシュコードを計算するのに役立つことがわかりましたTuple<T>が、それ以外は、
7 に答える
一般的には、あまり使用されません。ただし、ビット レベルの操作を扱う場合は非常に便利です。たとえば、数値のビットを出力する
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();
}
2 の累乗を書くと便利です。
クイック: 2 27とは?
答え:1 << 27
書く1 << 27ことは、よりも簡単で理解しやすいです134217728。
私はハードウェアを扱う際にかなり頻繁に使用します。これはおそらく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);
これらはあなたが毎日するようなことではないかもしれません。しかし、定期的にハードウェアに接続している私たちにとってはそうです。
* を使用せずに乗算する必要がある場合は、.NET で乗算演算子を使用せずに乗算を実装する方法:)
または、数独ソルバー数独有効性チェック アルゴリズムを作成します。このコードはどのように機能しますか?
実際には、私の(限られた)経験で使用されたのは、(おそらく)紛らわしい乗算方法(最初のリンクを参照)として、または BitFlags の設定(上記の数独ソルバー)と組み合わせて使用されたときだけでした。
.NET では、ビット レベルで作業する必要はほとんどありません。ただし、必要に応じて、シフトできることが重要です。
ビット演算子はスペースを節約するのに適していますが、最近ではスペースはほとんど問題になりません。
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)
};
個々のビットを操作する必要がある場合は、ビット シフトが使用されます。たとえば、多くの暗号化アルゴリズムでは多くのビット シフトが見られます。
最適化では、乗算/除算の代わりに使用できます。左シフトは、2 倍することと同じです。右シフトは除算に等しい。このレベルの最適化は不要な場合が多いため、おそらくこれが行われることはもうありません。
それ以外に、それを使用する多くの理由は考えられません。以前に使用されたのを見たことがありますが、本当に必要な場合はめったになく、通常はより読みやすい方法を使用できました。
2倍する必要があるときはいつでも;)
本当に私が持っている唯一の用途は、相互運用コードとビットフィールドです。