C 中的波浪号运算符

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7207391/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 16:36:05  来源:igfitidea点击:

The tilde operator in C

c++coperators

提问by Paul Manta

I've seen the tilde operator used in the ELF hashing algorithm, and I'm curious what it does. (The code is from Eternally Confused.)

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

回答by GWW

The ~operator is bitwise NOT, it inverts the bits in a binary number:

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

NOT 011100
  = 100011

回答by dlev

~is the bitwise NOT operator. It inverts the bits of the operand.

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

For example, if you have:

例如,如果您有:

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

回答by immortal

This is the bitwise NOT operator. It flips all the bits in a number: 100110 -> 011001

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

回答by Sander De Dycker

It is the bitwise NOT operator. It inverts all bits in an integer value.

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

回答by Cedekasme

The tilde character is used as an operator to invert all bits of an integer (bitwise NOT).

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

For example: ~0x0044 = 0xFFBB.

例如:~0x0044 = 0xFFBB

回答by Minion

Tilde operator (~) alsocalled bitwise NOT operator, performs one's complementof any binary number as argument. If the operand to NOT is decimal number then it convert it as binary and perform's one's complement operation.

波浪号运算符 (~)称为按位非运算符,将任何二进制数的补码作为参数执行。如果 NOT 的操作数是十进制数,则将其转换为二进制并执行其补码运算。

To calculate one's complement simply invert all the digit [0-->1] and [1-->0] Ex : 0101 = 5; ~(0101) = 1010. Use of tilde operator : 1. It is used in masking operation , Masking means setting and resetting the values inside any register . for ex :

要计算补码,只需反转所有数字 [0-->1] 和 [1-->0] 例如:0101 = 5; ~(0101) = 1010. 波浪号运算符的使用: 1. 用于屏蔽操作,屏蔽意味着设置和重置任何寄存器内的值。例如:

char mask ;
mask = 1 << 5 ;

It will set mask to a binary value of 10000 and this mask can be used to check the bit value present inside other variable .

它将掩码设置为二进制值 10000,此掩码可用于检查其他变量中存在的位值。

int a = 4;
int k = a&mask ; if the 5th bit is 1 , then k=1 otherwise k=0. 

This is called Maskingof bits. 2.To find binary equivalent of any number using masking properties.

这称为位掩码。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");
  }  
}

Output : Decimal 10 is same as 00001010

输出:十进制 10 与 00001010 相同

My observation:For the maximum range of any data type , one's complement provide the negative value decreased by 1 to any corresponding value. ex:
~1 --------> -2
~2---------> -3
and so on... I will show you this observation using little code snippet

我的观察:对于任何数据类型的最大范围,补码提供减 1 到任何相应值的负值。例如:
~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

Note : This is valid only for the range of data type. means for int data type this rule will be applicable only for the value of range[-2,147,483,648 to 2,147,483,647].
Thankyou .....May this help you

注意:这仅对数据类型范围有效。表示对于 int 数据类型,此规则仅适用于范围 [-2,147,483,648 到 2,147,483,647] 的值。
谢谢..... 可能这对你有帮助