programing

C의 칠드 연산자

prostudy 2022. 5. 28. 09:05
반응형

C의 칠드 연산자

ELF 해싱 알고리즘에서 사용되는 칠드 연산자를 봤는데, 어떤 역할을 하는지 궁금하네요. (이 코드는 영구적으로 혼란스러움에서 온 입니다.)

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

~연산자는 비트 단위 NOT이며, 이진수의 비트를 반전시킵니다.

NOT 011100
  = 100011

~는 비트 단위 NOT 연산자입니다.오퍼랜드의 비트를 반전시킵니다.

예를 들어 다음과 같습니다.

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

칠드 문자는 정수의 모든 비트를 반전하는 연산자로 사용됩니다(비트 단위로는 NOT).

예를 들어 다음과 같습니다.~0x0044 = 0xFFBB.

Tilde 연산자(~)는 비트 단위 NOT 연산자라고도 하며, 인수로서 임의의 이진수를 보완합니다.피연산자가 10진수일 경우 피연산자는 이를 2진수로 변환하고 자신의 보완 연산을 수행합니다.

보를 계산하려면 모든 자리 [0-->1] 및 [1-->0]를 반전시키면 됩니다. 예: 0101 = 5; ~(0101) = 1010.tilde 연산자 사용: 1.마스킹 동작에서 사용됩니다.마스크는 레지스터 내부의 값을 설정 및 리셋하는 것을 의미합니다(ex:

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]의 값에만 적용됩니다.
감사합니다...도움이 되십니까?

이것은 비트 단위 NOT 연산자입니다.숫자 100110 -> 011001의 모든 비트가 플립됩니다.

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

언급URL : https://stackoverflow.com/questions/7207391/the-tilde-operator-in-c

반응형