web-dev-qa-db-ja.com

Cのチルダ演算子

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;
}
85
Paul Manta

~演算子はビット単位 [〜#〜] not [〜#〜] で、2進数のビットを反転します。

NOT 011100
  = 100011
115
GWW

~はビット単位のNOT演算子です。オペランドのビットを反転します。

たとえば、次の場合:

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

これはビット単位のNOT演算子です。数字のすべてのビットを反転します:100110-> 011001

11
immortal

チルダ文字は、整数のすべてのビットを反転する演算子として使用されます(ビット単位のNOT)。

例えば: ~0x0044 = 0xFFBB

7
Cedekasme

これはビット単位のNOT演算子です。整数値のすべてのビットを反転します。

7

チルダ演算子(〜)alsoビットごとのNOT演算子と呼ばれ、引数として任意の2進数の1の補数を実行します。 NOTのオペランドが10進数の場合、2進数として変換し、1の補数演算を実行します。

補数を計算するには、すべての数字[0-> 1]および[1-> 0]を単純に反転します。Ex: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. 

これはMasking of bitsと呼ばれます。 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進数10は00001010と同じです

私の観測:任意のデータ型の最大範囲では、1の補数が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

注:これは、データ型の範囲でのみ有効です。 intデータ型の場合、このルールはrange [-2,147,483,648〜2,147,483,647]の値にのみ適用されます。
ありがとう.....お役立てください

1
Prakash Sharma