C中的波浪号运算符

Pau*_*nta 88 c c++ operators

我已经看到了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;
}
Run Code Online (Sandbox Code Playgroud)

GWW*_*GWW 116

~操作是按位NOT,它反转位二进制数:

NOT 011100
  = 100011
Run Code Online (Sandbox Code Playgroud)

  • 按位非对许多事情都很有用,例如位掩码。我不确定您所说的无符号到有符号整数转换是什么意思。 (2认同)
  • 等等,你不应该和位掩码?这就是我的位读者如何做到这一点,但它很敏感.我读过如果你有X而不是它,那么减去一个你会得到签名号码的未签名版本,这是不正确的? (2认同)
  • 我在位掩码上使用按位NOT与AND结合使用,以在更改它们之前清除特定位. (2认同)
  • 有人询问"未签名转换签名".由`~`执行的操作也称为"一个补码",这是二进制否定的一种形式.实际上,所有现代计算机都使用二进制补码算法,即按位逆运算加一.因此对于有符号整数变量`x`,通常会发现`~x + 1`给出的值与`-x`相同.例如,`printf("%hx%hx \n", - 1234,~1234 + 1)`在我的机器上打印`fb2e fb2e`. (2认同)
  • @MarcusJ是的,一个补码适用于将signed转换为unsigned(signed-> unsigned).(注意虽然将值分配给声明不同的变量并让编译器担心它会更容易.但是它确实_not_工作相反(unsigned-> signed),部分原因是可能的无符号值跨越更宽的范围而不是可以塞进一个有符号的变量,部分是因为没有明确定义 - 从外部信息可能 - 这个问题没有明确定义 - 要发明什么标志.你的两条评论得到了不同的答复,因为它们指明了相反的方 (2认同)

dle*_*lev 41

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

例如,如果您有:

char b = 0xF0;  /* Bits are 11110000 */
char c = ~b;    /* Bits are 00001111 */
Run Code Online (Sandbox Code Playgroud)


imm*_*tal 11

这是按位NOT运算符.它会翻转一个数字中的所有位:100110 - > 011001


San*_*ker 7

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


Ced*_*sme 7

波形符号用作运算符以反转整数的所有位(按位NOT).

例如:~0x0044 = 0xFFBB.