C中的波浪号运算符

时间:2011-08-26 15:53:28

标签: c++ c operators

我见过在ELF哈希算法中使用的波浪号运算符,我很好奇它的作用。 (代码为from 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;
}

6 个答案:

答案 0 :(得分:115)

~运算符是按位NOT,它反转二进制数中的位:

NOT 011100
  = 100011

答案 1 :(得分:41)

~是按位NOT运算符。它反转操作数的位。

例如,如果你有:

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

答案 2 :(得分:11)

这是按位NOT运算符。 它会翻转数字中的所有位:100110 - &gt; 011001

答案 3 :(得分:7)

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

答案 4 :(得分:7)

tilde字符用作运算符来反转整数的所有位(按位NOT)。

例如:~0x0044 = 0xFFBB

答案 5 :(得分:0)

Tilde运算符(〜)称为按位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到任何相应的值。 例:
~1 --------&gt; -2
〜2 ---------&GT; -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]的值。
谢谢.....这可以帮助你