Paul Manta
Paul Manta

Reputation: 31567

The tilde operator in C

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.)

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;
}

Upvotes: 115

Views: 117806

Answers (6)

Minion
Minion

Reputation: 1064

Tilde operator (~) also called bitwise NOT operator, performs one's complement of 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.

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 :

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 .

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

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

#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

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

#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

Upvotes: 1

Cedekasme
Cedekasme

Reputation: 2037

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

For example: ~0x0044 = 0xFFBB.

Upvotes: 9

Sander De Dycker
Sander De Dycker

Reputation: 16243

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

Upvotes: 7

GWW
GWW

Reputation: 44093

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

NOT 011100
  = 100011

Upvotes: 155

immortal
immortal

Reputation: 3188

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

Upvotes: 12

dlev
dlev

Reputation: 48596

~ 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 */

Upvotes: 49

Related Questions