• ベストアンサー

java >>>記号について

現在Androidアプリを学習しています。 以下コードの解釈がわかりません。 呼び出し int idx = rand(6); private static Rondom rand = new Rondom(); public static int rand(int num) { return (rand.nextInt() >>> 1) % num; } 特に >>> の記号が意味不明です。 ご教授のほどよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

> 上記コードの場合、乱数をビットシフトして6で割ったあまりと、回りくどいやり方が必要なのでしょう まず、numで割った余り、というのは、 0<=n<numの整数乱数nを求めるため、というのはよろしいでしょうか。 ビット演算ですが、今回の例では、乱数の質を高めようとしているのだと思われます。 コンピュータが発生する乱数の多くは「疑似乱数」といって、一見バラバラに見えて、実際には計算によって求めたもので、同じ初期条件からは同じ「乱数」が同じ順番で発生します。 JavaのRandomには「線形合同法」という非常に単純で、質のあまりよろしくないものが使われています。 ここでいう質とは、値が偏らない、とか、短いパターンを繰り返さない(奇数のあとには必ず偶数、とかいうことが無い)とかいうものです。 線形合同法では、上位ビットや下位ビットに傾向が出やすいので、真ん中あたりを使って質を上げる、というテクニックがあります。劇的な効果は無いですが、ちょっとだけましになります。

参考URL:
http://www001.upp.so-net.ne.jp/isaku/rand.html

その他の回答 (3)

  • gfe01045
  • ベストアンサー率61% (19/31)
回答No.3

gfe01045 です。 >> ビット演算を使用するメリットがいまいち解らないのですが・・・。 処理の速さ以外にはメリットは特にないと思います。 ただ、ビット単位の操作を行なわなければならないプログラムを書くときには必ず使うやりかたです。 画像処理などでデータのビット変換(マスキング)等・・・ +-などの演算子と同じようなものと考えています!! 頑張ってください!!

abuhiro
質問者

お礼

非常に参考になりました。 まだまだ、勉強不足でした。 ありがとうございました。m(_ _)m

  • gfe01045
  • ベストアンサー率61% (19/31)
回答No.2

つぎのソースをコンパイルして実行してみてください。 おおむね理解しやすいと思います!! public class bit{ public static void main(String[] args){ int bits=6;//0110 System.out.println(bits&15);//and System.out.println(bits|15);//or System.out.println(bits^15);//xor System.out.println(~bits); //not//符合付き System.out.println(bits>>2);//rshift System.out.println(bits<<2);//lshift } }

abuhiro
質問者

お礼

アドバイスありがとうございます。 ビット演算について、もう少し勉強してみます。 ビット演算を使用するメリットがいまいち解らないのですが・・・。 上記コードの場合、乱数をビットシフトして6で割ったあまりと、回りくどいやり方が必要なのでしょう(+o+)

回答No.1
abuhiro
質問者

お礼

アドバイスありがとうございます。 上記リンクを参考にビット演算について、もう少し勉強してみます。 上記コードの場合、乱数をビットシフトして6で割ったあまりと、回りくどいやり方が必要なのでしょう(+o+) ビット演算を使用するメリットは高速に処理できるという事なのでしょうか? コードを見ても非常に解りづらくなってしまうので、普通に四則演算したいのですが・・・(^_^;)

関連するQ&A