Java初心者がどのようにJavaすべての「ビットシフト」が機能するかを説明しています)の良いチュートリアルに感謝します。
私はいつもそれに出くわしますが、それがどのように機能するか理解していませんでした。 Javaのバイトシフト/ビット操作で可能なすべての操作と概念を説明する必要があります。
これは私が言いたいことのほんの一例です(しかし、私はすべての可能な操作を説明するチュートリアルを探しています):
byte b = (byte)(l >> (8 - i << 3));
さて、公式のJavaチュートリアル ビットワイズ演算子とビットシフト演算子 では、Javaで利用可能な実際の操作とそれらの呼び出し方法について説明しています。
「ビットシフトで何ができるか」と思っているなら、それはJava固有ではありません。低レベルのテクニックなので、「クール」のリストは知りません。定義に精通し、それが使用されている他のコードに目を向けて、それらが何をしたかを見る価値があります。
多くの場合、ビットトゥイドリングは、明確さを犠牲にして効率を向上させることに注意してください。たとえば、a << 1
は通常a * 2
と同じですが、間違いなくそれほど明確ではありません。繰り返しXORは、一時変数を使用せずに2つの数値を交換できますが、一般的に、一時変数を使用してコードをより明確に( 、ユーティリティメソッドで)。したがって、この点で優れた例を挙げることは困難です。なぜなら、アーキテクチャレベルで新しいものや深遠なものを達成する可能性は低いからです。低レベルの詳細がすべてです。 (そして、「野生」でのビットトゥイドリングの膨大な数の使用は、時期尚早な最適化のインスタンスであると推定します。)
シフト演算子を使用するときは、一般的なエラーを繰り返さないように注意してください!!
次の SO post が示唆するように、受け入れられた回答の著者は言及しています:
"一部の言語では、シフト演算子をintより小さいデータ型に適用すると、オペランドのサイズが自動的にintに変更されます。"
これは、たとえばバイトを操作するときに覚えておくことが絶対に重要です。そうしないと、予期しない結果が生じる可能性があります(私がしたように)。
次のビットパターンのバイトを指定します。
1001 0000
4ビットずつビットシフトを試みて、次のようなintに割り当てたとき:
int value = byteValue >>> 4;
私が持っていることを期待しています:
0000 1001 (or a value of 9)
しかし、私は巨大な番号を取得します!これは、byteValueがint[〜#〜] before [〜#〜]にキャストされるためですビットシフト演算。したがって、代わりに次のような結果になります。
1111 1111 1111 1111 1111 1111 1001
可能な組み合わせは無限にあります。ただし、これらは1つ以上の組み合わせで構成されます
>> shift right with sign extension.
>>> shift right with out sign extension.
<< shift left.
理解を得るために、2進数を紙に書いて、何が起こるかを考えてみることをお勧めします。チュートリアルでそれを読んでも理解を保証するものではありません。彼らがこれまで助けていない場合はesp。
シンプルだが明確なチュートリアルがあります こちら
ビットシフトの仕組みの詳細 です。公式チュートリアルではカバーされていない直感的でない動作がいくつかあります。たとえば、右側のオペランドの範囲は制限されており(intは0〜31、longは0〜63)、その範囲を超えても警告は生成されません。 )、予期しない動作を引き起こす可能性があります。
これは正確なチュートリアルではありませんが、個人用の ビットシフト関数のライブラリ in Javaをご検討ください!
また、Google検索で "bitwise tricks" を検索すると、多くの資料が見つかります。これらの多くはC/C++にありますが、ほとんどの構文は同じなので、一般的にJavaに変換するのは簡単です。
このサイトは、ビット操作で何ができるかについての非常に良いチュートリアルを提供しているようです(したがって、Javaに固有ではありませんが、翻訳は非常に簡単です)
http://www.bogotobogo.com/cplusplus/quiz_bit_manipulation.html
上記のチュートリアルでは、
Java実装の束を持っているファイル
これらはビットシフトについて学習しているときに見つけた2つの優れたチュートリアルで、Javaではありませんが、ほとんどの言語は同じ演算子を使用し、理論は同じです。