C中的代字符运算符
我已经看到了在ELF哈希algorithm中使用的波浪符运算符,我很好奇它是做什么的。 (代码来自Eternal 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; }
~
运算符是按位NOT ,它将二进制数中的位反转:
NOT 011100 = 100011
~
是按位NOT运算符。 它反转操作数的位。
例如,如果您有:
char b = 0xF0; /* Bits are 11110000 */ char c = ~b; /* Bits are 00001111 */
这是按位运算符。 它翻转一个数字中的所有位:100110 – > 011001
这是位运算符。 它将整数值中的所有位反转。
代字符被用作运算符来反转整数的所有位(按位NOT)。
例如: ~0x0044 = 0xFFBB
。
Tilde运算符(〜) 也称为按位NOT运算符,作为参数执行任何二进制数的补码 。 如果NOT的操作数是十进制数,则将其转换为二进制数并执行其补码操作。
要计算补码,只需将所有的数字[0 – > 1]和[1 – > 0]反转,如:0101 = 5; 〜(0101)= 1010.使用波形符号运算符:1.用于掩码操作,掩码表示设置和重置任何寄存器内的值。 例如:
char mask ; mask = 1 << 5 ;
它将掩码设置为10000的二进制值,这个掩码可以用来检查其他variables中存在的位值。
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相同
我的观察 :对于任何数据types的最大范围,补码提供负值减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 ab return 0; } Output: 0
注意:这仅适用于数据types的范围。 用于int数据types的方法此规则将仅适用于范围[-2,147,483,648到2,147,483,647]的值。
Thankyou …..可以帮助你