2011-08-26 74 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 .....這可以幫助你