2017-01-29 3 views
0

나는 하나의 0이 아닌 비트만을 포함하는 두 개의 동일하지 않은 정수를 가지고 있습니다. 더 중요한 비트를 가진 정수를 테스트하는 방법?어떤 1 비트 정수가 더 중요한 비트를 가지고 있습니까?

예 :

test(0b1000_0000, 0b0100_0000); // Should return true 
test(0b0010_0000_0000, 0b0100_0000_0000); // Should return false 

test의 가장 효율적인 구현은 무엇입니까

?

+5

숫자로만 비교하십시오. – rkosegi

+0

@rkosegi 정수는 Java로 로그인되어 있습니다. 음의 정수에서는 작동하지 않습니다. – ZhekaKozlov

답변

0

이것이 가장 효율적인 구현이라고 생각합니다. 그리고이 너무 음수 작동 :

static boolean test(int int1, int int2) { 
    return ((int2 - 1) & int1) == 0; 
} 
+1

이 마법은 무엇입니까 – shmosel

+1

오직 하나의 세트 비트를 가진 숫자에서 하나를 뺀 것은 세트 비트를 끄지 만 10000 → 1111처럼 다음의 모든 비트를 켭니다. 하나의 세트 비트 설정된 비트가 원래 숫자의 다음 비트 중 하나 인 경우에만 0이 아닌 숫자가됩니다. –

4

힌트 :이 작업을 수행하는 "깨끗한"방법은 Integer.compareUnsigned 또는 Integer.numberOfLeadingZeros 중 하나를 사용하는 것입니다.

(경고 :은 "서명되지 않은"방법은 자바 8에서만 사용할 수 있으며 나중에 ...)


시험의 가장 효율적인 구현은 무엇입니까?

질문의 효율성 부분에 대한 답변은 플랫폼에 따라 다릅니다. 정말로 관심이 있다면 사람들이 제공하는 다양한 대안을 벤치 마크하십시오.

+0

합리적인 구현이 오버 헤드에서 손실 될만큼 빠르기 때문에 실제로 벤치마킹하기가 어렵습니다. –

+1

좋은 마이크로 벤치 마크 프레임 워크를 사용하여 적절하게 설계된 벤치 마크를 사용하여이를 해결할 수 있습니다. –

+0

힌트 : 작업을 여러 번 반복하고 총 시간을 측정 한 다음 반복 횟수로 나누십시오. (또는 총 시간을 비교하지 마라.) 아무리해도 1) 어렵지 않다. 2) 프레임 포크가있다. 3) OP가 이런 종류의 것을 염려한다면, 그는 배워야한다. 이런 종류의 벤치마킹을하십시오. –