2013-09-22 3 views
0

"가장 중요한 비트"를 검색하는 경우 이 너무 많아 결과가 너무 많아서 내 요구 사항에 맞는 대답을 찾을 수 없습니다.긴 비트로 가장 중요한 비트 찾기

질문 자체는 매우 간단합니다. "부호없는 long에서 가장 중요한 세트 비트를 어떻게 찾을 수 있습니까?" 계산을 할 때 가장 오른쪽의 비트 위치는 '0'입니다.

나는 그것이 가장 낮은 비트 마스킹 확인 후 두번째 가장 낮은 반복 한 후 내 수를 증가하고있는 동안 등

내가 전에 이런 짓을 한에 한 번 왼쪽하지만 어떤 이유에서 시프 팅 포함 것을 알고있다 나는 지금 그것을 할 수 없다.


편집 :!

#include <stdio.h> 

int findExponent(unsigned long L){ 

    int exponent = -1; 

    unsigned long shift = L; 

    while(0 != shift) 
     exponent++, shift >>=1; 

    if (exponent >= 0) 
     printf("The most significant bit of L is at position %d\n", exponent); 
    else{ 
     exponent = 0; 
     printf("L is zero\n"); 
    } 
    return exponent; 
} 


int main(int argc, char** argv){ 

    long check = 8L; 

    findExponent(check);//2 
    findExponent(21421L);//14 
    findExponent(0L);//(is zero) 
    findExponent(1L);//0 
} 
: 혼란을 유감 "가장 중요한"내가 왼쪽으로 설정 의미 비트에 의해 * 다음은


내 기능 솔루션 및 몇 가지 테스트 케이스입니다

+1

"가장 중요한 비트"와 "가장 오른쪽 비트"는 다른 것일 수 있습니다 – LihO

+0

어딘가에 오타를 만들었습니까? 그랬다면 미안해. 가장 왼쪽 세트 비트를 찾는 것입니다. – Joshua

+0

@LihO : 사실이지만, 설명 적입니다. 즉, 비트 위치 값이 0에서 시작하여 오른쪽에서 왼쪽으로 증가합니다. –

답변

3

"부호없는 long에서 최상위 비트는 어떻게 찾을 수 있습니까?"

마지막 1 개가 삭제 될 때까지 오른쪽으로 이동할 수 있습니다. 값이 하나의 모든 악재는 달리 제로 가장 표시하는 비트 하나 :

오른쪽 쉬프트가와 XOR 서명 된 경우이 순간,이 값은 물론 0

#include <stdio.h> 
int main(void) { 
      unsigned long x = 3333; 
      unsigned long y = x; 
      int p = -1; 
      while (0 != y) 
       p++, y >>= 1; 
      if (p >= 0) 
       printf("The most significative bit of x is at position %d\n", p); 
      else 
       printf("x is zero\n"); 
} 
+0

오늘 아침에 침대에 누워있는 동안 나는 매우 유사한 무엇인가를 실제로 생각했다! 내가 잠을 자고 싶었다고 생각합니다. :) P ++, y >> = 1, 제 생각보다 더 컴팩트합니다. – Joshua

0

부호있는 값이 0보다 작을 때까지 왼쪽 쉬프트를 수행 한 다음 MSb 위치 값에서 수행 된 쉬프트 수를 뺍니다 (또는 d 대신에 ecrement).

+0

"부호없는 long에서 가장 중요한 비트를 찾는 방법은 무엇입니까?" – pablo1977

+0

그 비트를 놓쳤습니다. 다행히도 비교에서이를 캐스팅 할 수 있으며 컴파일러는 DTRT를 수행합니다. –

0
unsigned long x = val & ((~0ULL >> 1)^(~0ULL)); 

된다. .. 8 비트 예제.

0011 1100 -> val 
1111 1111 -> (~0) 
0111 1111 -> (~0 >> 1) 
1000 0000 -> ((~0 >> 1)^(~0)) 
0000 0000 -> val & ((~0 >> 1)^(~0)) !most significant bit from val is zero 
+1

OP가 명확 해짐에 따라 그는 실제로 msb 값이 아닌 가장 왼쪽 세트 비트의 위치를 ​​원했습니다. – harold

관련 문제