2012-04-29 12 views
1

長い数字があります。今、私は(擬似コードで指定)は、次のされたい、ロング・カウント・セットおよびアンセット・ビットでのJavaビット操作

int cnt1 = 0 
int cnt2 = 0 

for each two bits of that long 

     if the two bits == 11 
      then cnt1++ 

     else 
      cnt2++ 

    Print i and i+1 th bits are ... (example 00, 11 etc.) and cnt1 = ... and cnt2 = ... 

(for example if number is three (representation "00 00 00 .... 11)" 
    it will give output cnt1 = 1 and cnt2 = 31) 

は誰がどのようにそれを行うために私を助けることができますか?あなたがする必要がどのような

+0

@Jeffrey、。しかし、最も左の0ビットの例 "00 00..11" – Arpssss

+0

@haroldの問題を解決する方法を理解することはできません。例えば、i番目とi + 1番目のビットは "this"と対応するカウントです。 – Arpssss

+0

@Arpssssはい私はそれを見ました、今、その示唆を無視してください。 – harold

答えて

3

はすべての反復で右に2ビットシフトしておくと、数3(バイナリ11)とビット単位のAND(&)の操作を行うことである。

long number; 
int cnt1 = 0; 
int cnt2 = 0; 
long test = 3; 
int counter = 0;  

while(counter < 64) { // we have 64 bits to inspect 
    if((number & test) == 3) { // last 2 bits are 11 
     cnt1++; 
    } else { // last 2 bits are either 10, 01 or 00 
     cnt2++; 
    }   
    counter += 2; 
    number = number >>> 2; // shift by 2 bits to the right 
} 
+0

[今のところいいですね](http://ideone.com/JDFyh)+1 –

+0

ループ条件while(cnt1 + cnt2 <32)を使って 'counter'を一切スキップすることができます。 – dasblinkenlight

+0

ありがとうございました。私はそれが正常に動作することを確認した。 LSBからMSBまで。 – Arpssss

2

必要なもの行うにはこれは私が唯一のいくつかのポインタ与える宿題であると仮定すると、ビットマスクを作成し、値の上にそれを実行している:

  • あなたが既に与えたビットマスクを:long mask = 0x03L;
  • を他のすべての2ビットをチェックします、あなたのあなたがマスクされるまで値をチェックするためのループを使用することができます
  • マスクは左2 potisions
  • は0
  • マスクあなたが入れた場合

に対して値をチェックするためにビット単位-、オペレータ&を使用する値を持っていますコードにヒントの上、あなたは

編集 :-)今の結果がでていることを、あなたの答えを持っていますが、私の解決策は次のようになります。

long cnt1 = 0; 
long cnt2 = 0; 

for (long mask = 0x03; mask != 0; mask <<=2) { 

    (mask == (value & mask)) ? cnt1++ : cnt2++; 
} 
2

短い答え。シフト演算子と

long num = ~0L; 
int cnt1 = Long.bitCount(num & (num >>> 1) & 0x5555555555555555L); 
System.out.println(cnt1); 
int cnt2 = 32 - cnt1; 

プリント

32 
+0

いいえ、ピーター。私が知る必要があるのは、i番目とi + 1番目の位置にあるビットは、11か(10,00,01)かを意味します。 – Arpssss

+0

私は答えが1と31です。私は長い間探していたので正しいはずです。 – Arpssss

+0

申し訳ありませんが、正しいです、答えは正しいです。私の+1。 – Tudor