2016-04-09 8 views
0

最近、私はUFのプログラミング競技に行きました。これは質問の1つでした。これは私ががわからないんです一部ですhttp://hastebin.com/unozolusiw.avrasmJava - 裁判官の解答(RGB)の説明

http://i.imgur.com/2Fg4MfO.jpg

これは裁判官の溶液でした。

for (int j = 0; j < N; j++) { 
       if ((i & (1 << j)) != 0) { 
        sumR += rs[j]; 
        sumG += gs[j]; 
        sumB += bs[j]; 
       } 
      } 

私はパートを追加し合計を理解し、そしてNは例量であることを、この部分は、私は理解していない:

if ((i & (1 << j)) != 0) 

私は何をすべきか&と< <知っているが、私ドンその組み合わせに追加する必要があるかどうかを確認する方法は理解できません。

答えて

0

これは、基本的にすべての2進数(0〜2^N-1)を生成します。

対応するビットが0以外の場合、組み合わせを形成する色を選択します。

6 = 0110のために例えば、あなたは1および2(右)からビットを選択:場合、私とあなたは、対応する色(j)を取ることビットで < jはcoinside。

J = 0001に対する

I = 0110、0010、0100、1000年

(なぜPOW = 1 < < N.だ色の組み合わせの最大2^Nの可能性があります。) -

ANDing iと1 < < jは、両方が共通の1ビットを持ち、ゼロに照合すると真であることを意味します(共通の1ビットを持ちます)。 1 < < jは1つの非ゼロビット(異なる位置に1つシフトされている)を持つことができるため、選択する色は多くても1つの共通ビットを持つことができます()。

 int pow = 1 << 5; 
     boolean works = false; 
     for (int i = 0; i < pow; i++) { 
      int sumR = 0; 
      int sumG = 0; 
      int sumB = 0; 

      for (int j = 0; j < 5; j++) { 
      if((i & (1<<j)) !=0) System.out.println(i+" 22 "+j); 
      System.out.println(i+" "+j); 
      } 

あなたは組み合わせを表示するには、このコードを試すことができます

関連する問題