2014-12-18 2 views
-4

첫 번째 예제에서 "&"의 기능을 이해하지 못합니다. 이전에 C에서 이러한 종류의 return 문을 경험하지 못했습니다. 친절하게 설명하십시오! 감사return 식에서 & 연산자의 이상한 사용

여기

uint hashToRange(int h)  {return h & mask;} 
// In this example mask is the data member of generic class 
// These are some similar examples 
    bool lessIndex(intT a, intT b) 
    { 
     return 2 * hashToRange(a - b) > m; 
    } 

    inline int hashInt(unsigned int a) { 

     return hash(a) & (((unsigned) 1 << 31) - 1); 
    } 
+4

[C++ 연산자 목록] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Bitwise_operators) – Borgleader

+1

@Borgleader 나는 연산자를 알고 있지만 return 문에서 어떻게 작동하고 있습니까? 그 설명이 필요합니다. –

+0

여기에있는 모든 downvoting을 이해하지 못합니다. 이전에 본 적이없는 이상 표현은 사소하지 않습니다. – dasblinkenlight

답변

6

조작 &는 비트 AND 연산자이다 일부 함수의 예이다. 이 특별한 경우에는 32 비트 숫자의 부호 비트를 가려내는 데 사용됩니다. 그 작동 방식은 다음

이다 : 바이너리 (unsigned) 1 << 31의 값은 비트 31가 1로 설정이있는 수이고, 나머지 모든 비트는 제로로 설정 : 그것은와 숫자를 생성로부터

10000000 00000000 00000000 00000000 

1 감산 하위 31 비트 1로 설정하고, 부호 비트 * 제로로 설정 :

01111111 11111111 11111111 11111111 

이것은 hash(a)인가 마스크된다. 비트 AND를 수행하면 가장 중요한 "부호"비트를 제외한 모든 비트가 hash(a) 인 숫자가됩니다.이 비트는 이제 0으로 설정됩니다.

참고 :이 코드는 intunsigned이 모두 32 비트 유형이라고 가정합니다. 이 표준은 이것이 사실임을 보장하지 않습니다. 더 나은 방법은 정확한 크기를 보장하기 위해 int32_tuint32_t 유형을 사용하는 것입니다.

* 10000에서 1을 빼고 9999를 다시 얻는 것과 같은 원리가 여기에서 작동합니다.

+0

'sizeof unsigned'는 4라고 가정합니다. –

관련 문제