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
The tilde operator in C
提问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
回答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] 的值。
谢谢..... 可能这对你有帮助