Question

[Solved] 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;
}

Solution #1:

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

NOT 011100
  = 100011
Respondent: GWW

Solution #2:

~ 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 */
Respondent: dlev

Solution #3:

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

Respondent: immortal

Solution #4:

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

For example: ~0x0044 = 0xFFBB.

Respondent: Cedekasme

Solution #5:

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

Respondent: Sander De Dycker

Solution #6:

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("%dn",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

Respondent: Minion

The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Most Popular

To Top
India and Pakistan’s steroid-soaked rhetoric over Kashmir will come back to haunt them both clenbuterol australia bossier man pleads guilty for leadership role in anabolic steriod distribution conspiracy