【问题标题】:The tilde operator in CC中的波浪号运算符
【发布时间】:2011-11-04 15:55:02
【问题描述】:

我见过 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;
}

【问题讨论】:

    标签: c++ c operators


    【解决方案1】:

    波浪号运算符 (~) 称为按位非运算符,执行任何二进制数的反码 作为参数。如果 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 --------> -2
    ~2---------> -3
    等等...我将使用小代码 sn-p 向您展示这个观察结果

    #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] 的值。
    谢谢.....希望对您有所帮助

    【讨论】:

      【解决方案2】:

      波浪号用作运算符来反转整数的所有位(按位非)。

      例如:~0x0044 = 0xFFBB

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          NOT 011100
            = 100011
          

          【讨论】:

          • Bitwise NOT 可用于许多事情,例如位掩码。我不确定你所说的无符号到有符号整数转换是什么意思。
          • 等等,你不应该与位掩码吗?这就是我的阅读器的做法,但它很敏感。我读到如果你有 X 而不是它,那么减去一个你会得到一个有符号数字的无符号版本,这不正确吗?
          • 我在位掩码上使用按位 NOT 与 AND 结合使用以在更改特定位之前清除它们。
          • 有人询问“无符号到有符号的转换”。 ~ 进行的运算也称为“反码”,是二元否定的一种形式。几乎所有现代计算机都使用二进制补码算法,即按位求逆加一。因此,对于有符号整数变量x,您通常会发现~x + 1 给出的值与-x 相同。例如,printf("%hx %hx\n", -1234, ~1234 + 1) 在我的机器上打印 fb2e fb2e
          • @MarcusJ 是的,一个补码用于将有符号转换为无符号(有符号->无符号)。 (请注意,尽管将值分配给以不同方式声明的变量并让编译器担心它更容易。)但它确实以相反的方式工作(无符号->有符号),部分原因是可能的无符号值跨越的范围比塞入有符号变量的范围更广,部分原因是如果不指定(可能来自外部信息)要发明什么符号,这个问题就没有得到很好的定义。你的两个 cmets 得到了不同的回复,因为他们指定了相反的方向。
          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            例如,如果您有:

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

            【讨论】:

              猜你喜欢
              • 2012-01-08
              • 2019-05-17
              • 2021-11-03
              • 2012-04-22
              • 2017-03-22
              相关资源
              最近更新 更多