C中的波浪算子

The tilde operator in C

本文关键字:      更新时间:2023-10-16

我看过ELF散列算法中使用的波浪运算符,我很好奇它是做什么的。(代码来自《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

~是位非操作符。它对操作数的位进行反转。

例如:

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

这是位NOT操作符。它翻转一个数字中的所有位:100110 -> 011001

波浪形字符用作运算符,用于反转整数的所有位(按位NOT)。

例如:~0x0044 = 0xFFBB .

是位NOT操作符。

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

计算补数只需将[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
等等......我将使用一小段代码

向您展示这个观察结果
#include<stdio.h>
int main()
{
    int a , b;
    a=10;
    b=~a; // b-----> -11    
    printf("%dn",a+~b+1);// equivalent to a-b
    return 0;
}
Output: 0

注意:这只对数据类型的范围有效。对于int数据类型,此规则将只适用于[-2,147,483,648至2,147,483,647]范围内的值。
谢谢.....

相关文章:
  • 没有找到相关文章