2011-08-26 71 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而不是它,那么减去一个,你会得到一个有符号数的未签名版本,是不是正确的? – MarcusJ

38

~是按位操作者NOT。它反转操作数的位。

例如,如果您有:

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

这是按位NOT运算符。 它翻转所有位在一个数字:100110 - > 011001

7

它是按位NOT运算符。它将整数值中的所有位反转。

7

代字符字符被用作运算符来反转整数的全部位(按位NOT)。例如:~0x0044 = 0xFFBB

0

波形符运算符(〜)称为按位NOT运算符,执行一个人的任何二进制数作为参数的补充。如果NOT的操作数是十进制数,那么它将它转换为二进制并执行其补码操作。要计算补数,只需将所有数字[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是相同00001010

我观察:对于任何数据类型的最大范围内,一的补码提供减少1到任何相应的值的负值。 ex:
〜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]的值。
Thankyou .....这可以帮助你