1

番号が長いです。今私が欲しいのは次のとおりです(疑似コードで与えられます)、

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)

誰でもそれを行う方法を手伝ってもらえますか?

4

3 に答える 3

3

あなたがする必要があるのは、反復ごとに右に 2 ビットずつシフトし続け、数値 3 (2 進数では 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
}
于 2012-04-29T14:22:21.967 に答える
2

あなたがする必要があるのは、ビットマスクを作成し、それをあなたの値の上で実行することです.

  • あなたがすでに与えたビットマスク:long mask = 0x03L;
  • 2 ビットおきにチェックするには、マスクを 2 ポーション左にシフトします
  • マスクの値が0になるまで、forループを使用して値を確認できます
  • ビットごとの AND 演算子を使用&して、マスクに対して値をチェックします

上記のヒントをコードに入れると、答えが得られます:-)

結果が入ったので編集します。私の解決策は次のとおりです。

long cnt1 = 0;
long cnt2 = 0;

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

    (mask == (value & mask)) ? cnt1++ : cnt2++;
}
于 2012-04-29T14:27:40.513 に答える
2

短い答え。

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

版画

32
于 2012-04-29T14:28:28.973 に答える