[解決済み] ビット演算の実用例 [終了しました]
質問
- ビット演算は何に使ったことがありますか?
- なぜそんなに便利なのですか?
- 誰かとても簡単なチュートリアルを教えてください。
どのように解決するには?
誰もがフラグの使用例に夢中になっているようですが、ビット演算子の用途はそれだけではありません (おそらく最も一般的ですが)。また、C# は十分に高レベルの言語なので、他のテクニックはおそらくほとんど使用されないでしょうが、それでも知っておく価値はあります。以下は、私が思いつくものです。
は
<<
と
>>
もちろん、.NET JITオプティマイザがこれを実行してくれますが(他の言語のまともなコンパイラも同様)、もし本当に毎ミクロ秒を気にしているのなら、念のためこれを書いておくとよいでしょう。
これらの演算子のもうひとつの一般的な使用法は、2 つの 16 ビット整数を 1 つの 32 ビット整数に詰め込むことです。みたいな感じです。
int Result = (shortIntA << 16 ) | shortIntB;
これはWin32関数との直接のインタフェースの場合によくあることで、レガシーな理由でこのトリックを使うことがあります。
そしてもちろん、これらの演算子は、宿題の答え合わせをするときなど、経験の浅い人を混乱させたいときに便利です :)
実際のコードでは、代わりに乗算を使う方がはるかによいでしょう。
shl
と
shr
命令を使用するため、パフォーマンス上のペナルティはありません。
非常に多くの奇妙なトリックが
^
演算子 (XOR) を扱います。これは実際には非常に強力な演算子で、次のような性質があるからです。
-
A^B == B^A
-
A^B^A == B
-
もしあなたが
A^B
がわかっていればA
とB
がありますが、どちらかが分かればもう一方は計算できます。 - 演算子は乗算/除算/加算/減算のようなオーバーフローを起こしません。
この演算子を使ったトリックをいくつか見てきました。
中間変数なしで2つの整数変数をスワップする。
A = A^B // A is now XOR of A and B
B = A^B // B is now the original A
A = A^B // A is now the original B
項目ごとに1つの追加の変数を持つ2重リンクリストです。これはC#ではほとんど使われませんが、1バイト単位でカウントされる組み込みシステムの低レベルプログラミングでは便利かもしれません。
このアイデアは、最初の項目へのポインタ、最後の項目へのポインタ、そしてすべての項目に対する
pointer_to_previous ^ pointer_to_next
. この方法では、どちらの端からでもリストを走査することができ、しかもオーバーヘッドは従来のリンクリストの半分で済みます。以下は、トラバースするためのC++のコードです。
ItemStruct *CurrentItem = FirstItem, *PreviousItem=NULL;
while ( CurrentItem != NULL )
{
// Work with CurrentItem->Data
ItemStruct *NextItem = CurrentItem->XorPointers ^ PreviousItem;
PreviousItem = CurrentItem;
CurrentItem = NextItem;
}
最後から順にたどるには、一番最初の行を
FirstItem
から
LastItem
. これもメモリの節約になりますね。
もうひとつ、私が
^
演算子を使うもうひとつの場面は、複合型の型に対して HashCode を計算しなければならないときです。みたいな感じ。
class Person
{
string FirstName;
string LastName;
int Age;
public int override GetHashCode()
{
return (FirstName == null ? 0 : FirstName.GetHashCode()) ^
(LastName == null ? 0 : LastName.GetHashCode()) ^
Age.GetHashCode();
}
}
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Static readonly」対「const」。
-
[解決済み] \0-9]よりも効率が悪い
-
[解決済み] LINQのGroup by
-
[解決済み] C#で文字を繰り返し表示する最適な方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み] ビット演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】ビット演算子の実際の使用例【クローズド