2011-08-26 7 views
79

ELF 해시 알고리즘에 사용되는 물결표 연산자를 보았습니다. 그 기능이 무엇인지 궁금합니다. (from Eternally Confused 코드이다.)C의 물결표 연산자

unsigned elf_hash (void *key, int len) 
{ 
    unsigned char *p = key; 
    unsigned h = 0, g; 
    int i; 

    for (i = 0; i < len; i++) { 
    h = (h << 4) + p[i]; 
    g = h & 0xf0000000L; 

    if (g != 0) 
     h ^= g >> 24; 

    h &= ~g; 
    } 

    return h; 
} 

답변

105

~ 연산자 비트 NOT, 그것은 이진수의 비트 반전 :

NOT 011100 
    = 100011 
+0

이 서비스는 어떤 용도로 사용됩니까? 서명되지 않은 변환에서 사용할 수 있다고 들었지만 어떻게 표시되지 않습니까? – MarcusJ

+1

Bitwise NOT은 비트 마스크와 같은 여러 가지 작업에 유용합니다. 내가 서명하지 않은 정수로 변환하여 무슨 뜻인지 모르겠다. – GWW

+2

잠깐, 너는 비트 마스크를 가지고 있지 않니? 그게 내 비트 리더가하는 방법이지만, 그것은 민감합니다. X가 있고 NOT이 있으면 서명 된 숫자의 부호없는 버전을 가져 오는 코드를 뺍니다. 정확하지 않습니까? – MarcusJ

38

~ 비트가 NOT 연산자이다. 피연산자의 비트를 반전시킵니다.

char b = 0xF0; /* Bits are 11110000 */ 
char c = ~b; /* Bits are 00001111 */ 
10

이는 비트 NOT 연산자 : 당신이있는 경우 예를 들어

. 그것은 다수의 모든 비트를 플립 : 100,110 -> 011,001

7

그것은 비트 단위 NOT 연산자이다. 정수 값의 모든 비트를 반전시킵니다.

7

물결표는 정수 (비트 NOT)의 모든 비트를 반전하는 연산자로 사용됩니다.

예 : ~0x0044 = 0xFFBB.

0

물결표 연산자 (~) 이 NOT 연산자 비트라고는, 인수와 같은 이진수 1의 보수을 수행합니다. NOT에 대한 피연산자가 10 진수이면 2 진수로 변환하고 1의 보수 연산을 수행합니다.

1의 보수를 계산하려면 [0 -> 1]과 [1 -> 0]의 모든 숫자를 반전하십시오. 예 : 0101 = 5; ~ (0101) = 1010. 물결표 연산자 사용 : 1. 마스킹 작업에 사용되며 마스킹이란 모든 레지스터 내에서 값을 설정하고 재설정하는 것을 의미합니다. 예 :

char mask ; 
mask = 1 << 5 ; 

마스크를 10000의 이진 값으로 설정하고이 마스크를 사용하여 다른 변수 안에있는 비트 값을 검사 할 수 있습니다.

int a = 4; 
int k = a&mask ; if the 5th bit is 1 , then k=1 otherwise k=0. 

이것은 비트 마스크불린다. 2. 마스킹 속성을 사용하여 임의의 숫자와 동일한 이진수를 찾으십시오.

#include<stdio.h> 
void equi_bits(unsigned char); 
int main() 
{ 
    unsigned char num = 10 ; 
    printf("\nDecimal %d is same as binary ", num); 
    equi_bits(num); 
    return 0; 
} 
void equi_bits(unsigned char n) 
{ 
    int i ; 
    unsigned char j , k ,mask ; 
    for(i = 7 ; i >= 0 ; i--) 
    { 
    j=i; 
    mask = 1 << j; 
    k = n&mask ; // Masking 
    k==0?printf("0"):printf("1"); 
    } 
} 

출력 : 10 진수 10은 동일한

00001010으로 내 관찰 - 임의의 데이터 유형의 최대 범위에 대해 하나의 보수는 대응하는 값을 1만큼 감소 네거티브 값을 제공한다. 예 :
~ 1 --------> -2
~ 2 --------- -3
등등 ...이 코드는 작은 코드를 사용하여 보여 드리겠습니다. 스 니펫

#include<stdio.h> 
int main() 
{ 
    int a , b; 
    a=10; 
    b=~a; // b-----> -11  
    printf("%d\n",a+~b+1);// equivalent to a-b 
    return 0; 
} 
Output: 0 

참고 : 이는 데이터 유형 범위에만 유효합니다. int 데이터 유형의 경우이 규칙은 범위 [-2,147,483,648에서 2,147,483,647]의 값에만 적용됩니다.
감사합니다 .....이게 도움이 되길 바랍니다