C의 물결표 연산자


95

ELF 해싱 알고리즘에 사용 된 물결표 연산자를 보았는데 그것이 무엇을하는지 궁금합니다. (코드는 Eternally Confused에서 가져온 것 입니다.)

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;
}

답변:


126

~연산자 비트 인 NOT 는 이진수의 비트 반전 :

NOT 011100
  = 100011

1
비트 NOT은 비트 마스크와 같은 여러 가지에 유용합니다. 부호없는 정수를 부호있는 정수로 변환하는 것이 무엇을 의미하는지 잘 모르겠습니다.
GWW

2
잠깐, 당신은 비트 마스크를해야하지 않나요? 그것이 내 비트 리더가하는 방식이지만 감동적입니다. 나는 당신이 X를 가지고 있고 그것이 아니라면, 1을 빼면 서명 된 숫자의 서명되지 않은 버전을 얻게 될 것이라고 읽었습니다. 맞지 않습니까?
MarcusJ

2
AND와 함께 비트 마스크에서 비트 NOT을 사용하여 특정 비트를 변경하기 전에 지 웁니다.
GWW

2
누군가 "서명되지 않은 변환"에 대해 물었습니다. 에 의해 수행되는 연산 ~은 이진 부정의 한 형태 인 "1의 보수"라고도합니다. 거의 모든 최신 컴퓨터는 비트 역수에 1을 더한 2의 보수 산술을 사용합니다. 따라서 부호있는 정수 변수의 x경우 일반적으로 ~x + 1와 동일한 값 을 제공합니다 -x. 예를 들어, 내 컴퓨터 에서 printf("%hx %hx\n", -1234, ~1234 + 1)인쇄 fb2e fb2e합니다.
Steve Summit

2
@MarcusJ 예, 하나의 보완은 서명 된 것을 서명되지 않은 것으로 변환하는 데 사용됩니다 (서명 됨-> 서명되지 않음). (단순히 다르게 선언 된 변수에 값을 할당하고 컴파일러가 그것에 대해 걱정하게하는 것이 더 쉽습니다.) 그러나 부분적으로 가능한 부호없는 값이 더 넓은 범위에 걸쳐 있기 때문에 (unsigned-> signed) 반대 방향으로 작동 하지 않습니다 . 서명 된 변수에 넣을 수 있으며 부분적으로는-아마도 외부 정보에서-발명 할 부호를 지정하지 않고는 문제가 잘 정의되지 않았기 때문입니다. 두 댓글은 반대 방향을 지정하기 때문에 다른 응답을 받았습니다.
Chuck Kollars 2016 년

43

~비트 NOT 연산자입니다. 피연산자의 비트를 반전합니다.

예를 들어 다음과 같은 경우 :

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

12

이것은 비트 NOT 연산자입니다. 숫자의 모든 비트를 뒤집습니다 : 100110-> 011001


8

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

예 : ~0x0044 = 0xFFBB.



1

틸드 연산자 (~) 비트 NOT 연산자 라고도 하며 이진수 의 1의 보수 를 인수로 수행합니다. NOT에 대한 피연산자가 10 진수이면 2 진수로 변환하고 1의 보수 연산을 수행합니다.

1의 보수를 계산하려면 모든 숫자 [0-> 1]과 [1-> 0]을 반전하기 만하면됩니다. Ex : 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만큼 감소한 음수 값을 제공합니다. 예 :
~ 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]의 값에만 적용됩니다.
감사합니다 ..... 이것이 당신을 도울 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.