2012-04-28 2 views
1

길이가 깁니다. 이제 내가 원하는 것은 다음과 같다 (의사 코드로 주어진다).Java Finding Long 세트 비트 수

for each two bits of that long 

if the two bits == 11 

then count++ 

(for example if number is "11 01 10 00 11" it will give count = 2) 

아무도 나를 자바에서 효율적으로 처리하는 방법을 알려줄 수 있습니까?

+0

대답은 000011100000 무엇을해야 하는가? – Thorn

+0

@ 꼬인 횟수 = 1. – Arpssss

+0

허용 된 답변의 코드를 테스트했으며 0000001110000에 대해 1을 제공합니까? – Thorn

답변

2
public static int count11(long n) { 
    int cnt = 0; 
    while (n != 0) { 
    if ((n & 3) == 3) cnt++; 
    n >>>= 2; 
    } 
    return cnt; 
} 

짝수보다 효율적인 변형 :

public static int count11(long n) { 
    int cnt = 0; 
    while (n != 0) { 
    switch ((int)(n & 0x3F)) { 
    case 0x3F: cnt += 3; break; 
    case 0x3C: case 0x33: case 0xF: cnt += 2; break; 
    case 0x30: case 0xC: case 3: cnt++; 
    } 
    n >>>= 6; 
    } 
    return cnt; 
} 
+0

고마워요. 그것은 잘 작동합니다. – Arpssss

+0

4 비트 씩 이동하여 스위치의 두 개의 최하위 비트 쌍을 확인하거나 8 비트로도 효율성을 높일 수 있습니다. 그러나 당신이 그렇게 효율적 이길 필요는 없다. –