C의 물결표 연산자
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;
}
~
연산자 비트 인 NOT 는 이진수의 비트 반전 :
NOT 011100
= 100011
~
비트 NOT 연산자입니다. 피연산자의 비트를 반전합니다.
예를 들어 다음과 같은 경우 :
char b = 0xF0; /* Bits are 11110000 */
char c = ~b; /* Bits are 00001111 */
이것은 비트 NOT 연산자입니다. 숫자의 모든 비트를 뒤집습니다 : 100110-> 011001
비트 NOT 연산자입니다. 정수 값의 모든 비트를 반전합니다.
물결표 문자는 정수의 모든 비트를 반전시키는 연산자로 사용됩니다 (비트 NOT).
예 : ~0x0044 = 0xFFBB
.
틸드 연산자 (~) 는 비트 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과 동일
My observation :For the maximum range of any data type , one's complement provide the negative value decreased by 1 to any corresponding value. ex:
~1 --------> -2
~2---------> -3
and so on... I will show you this observation using little code snippet
#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
Note : This is valid only for the range of data type. means for int data type this rule will be applicable only for the value of range[-2,147,483,648 to 2,147,483,647].
Thankyou .....May this help you
참고URL : https://stackoverflow.com/questions/7207391/the-tilde-operator-in-c
'IT story' 카테고리의 다른 글
열 이름을 이스케이프하는 SQL 표준? (0) | 2020.09.13 |
---|---|
Node.js 또는 Erlang (0) | 2020.09.13 |
mongoDB / mongoose : null이 아닌 경우 고유 (0) | 2020.09.13 |
iOS7에서 동적 텍스트 크기로 사용자 정의 글꼴을 사용하는 방법 (0) | 2020.09.13 |
Android Studio : Gradle을 사용하여 서명 된 APK를 생성하는 방법은 무엇입니까? (0) | 2020.09.13 |