web-dev-qa-db-ja.com

Java「ビットシフト」チュートリアル?

Java初心者がどのようにJavaすべての「ビットシフト」が機能するかを説明しています)の良いチュートリアルに感謝します。

私はいつもそれに出くわしますが、それがどのように機能するか理解していませんでした。 Javaのバイトシフト/ビット操作で可能なすべての操作と概念を説明する必要があります。

これは私が言いたいことのほんの一例です(しかし、私はすべての可能な操作を説明するチュートリアルを探しています):

byte b = (byte)(l >> (8 - i << 3));
46
Markus

さて、公式のJavaチュートリアル ビットワイズ演算子とビットシフト演算子 では、Javaで利用可能な実際の操作とそれらの呼び出し方法について説明しています。

「ビットシフトで何ができるか」と思っているなら、それはJava固有ではありません。低レベルのテクニックなので、「クール」のリストは知りません。定義に精通し、それが使用されている他のコードに目を向けて、それらが何をしたかを見る価値があります。

多くの場合、ビットトゥイドリングは、明確さを犠牲にして効率を向上させることに注意してください。たとえば、a << 1は通常a * 2と同じですが、間違いなくそれほど明確ではありません。繰り返しXORは、一時変数を使用せずに2つの数値を交換できますが、一般的に、一時変数を使用してコードをより明確に 、ユーティリティメソッドで)。したがって、この点で優れた例を挙げることは困難です。なぜなら、アーキテクチャレベルで新しいものや深遠なものを達成する可能性は低いからです。低レベルの詳細がすべてです。 (そして、「野生」でのビットトゥイドリングの膨大な数の使用は、時期尚早な最適化のインスタンスであると推定します。)

34
Andrzej Doyle

シフト演算子を使用するときは、一般的なエラーを繰り返さないように注意してください!!

次の 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
15
Jeach

可能な組み合わせは無限にあります。ただし、これらは1つ以上の組み合わせで構成されます

>> shift right with sign extension.
>>> shift right with out sign extension.
<< shift left.

理解を得るために、2進数を紙に書いて、何が起こるかを考えてみることをお勧めします。チュートリアルでそれを読んでも理解を保証するものではありません。彼らがこれまで助けていない場合はesp。

13
Peter Lawrey

シンプルだが明確なチュートリアルがあります こちら

9
msb

ビットシフトの仕組みの詳細 です。公式チュートリアルではカバーされていない直感的でない動作がいくつかあります。たとえば、右側のオペランドの範囲は制限されており(intは0〜31、longは0〜63)、その範囲を超えても警告は生成されません。 )、予期しない動作を引き起こす可能性があります。

5
adam.r

これは正確なチュートリアルではありませんが、個人用の ビットシフト関数のライブラリ in Javaをご検討ください!

また、Google検索で "bitwise tricks" を検索すると、多くの資料が見つかります。これらの多くはC/C++にありますが、ほとんどの構文は同じなので、一般的にJavaに変換するのは簡単です。

5
mikera

このサイトは、ビット操作で何ができるかについての非常に良いチュートリアルを提供しているようです(したがって、Javaに固有ではありませんが、翻訳は非常に簡単です)

http://www.bogotobogo.com/cplusplus/quiz_bit_manipulation.html

上記のチュートリアルでは、

  • ビット演算
  • ビットの設定とクリア
  • ビット付き整数の表示
  • 10進数から16進数への変換
  • 整数に設定されたビット数(1の数)
  • 整数のビットセット位置
  • ビット操作によるインプレース整数スワップ
  • 整数Aを整数Bに変換するために必要なビット数
  • 整数の奇数ビットと偶数ビットを入れ替える
  • 何(n&(n-1)== 0)がチェックしていますか?
  • 2の補数
  • 整数のn番目のビットの反転
  • 浮動小数点数ビットパターン
  • 整数のビットパターン回文

Java実装の束を持っているファイル

http://geekviewpoint.com/

3
i8abug

これらはビットシフトについて学習しているときに見つけた2つの優れたチュートリアルで、Javaではありませんが、ほとんどの言語は同じ演算子を使用し、理論は同じです。

  1. ビットの調整
  2. ジムプラッシュによるPHPビットワイズチュートリアル
2
mike