C tilde operatörü


96

ELF hashing algoritmasında kullanılan tilde operatörünü gördüm ve ne işe yaradığını merak ediyorum. (Kod Ebedi Şaşkın'dan alınmıştır .)

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

Yanıtlar:


128

~Operatör bitler halinde DEĞİL bir ikili sayı bitleri tersine çevirir,:

NOT 011100
  = 100011

1
Bitsel NOT, bit maskeleri gibi birçok şey için kullanışlıdır. İşaretsizden işaretli tam sayıya dönüşümle ne demek istediğinizden emin değilim.
GWW

2
Bekle, VE bit maskesi yapman gerekmiyor mu? benim bit okuyucum böyle yapıyor, ama dokunaklı. Okudum, eğer X'iniz varsa ve DEĞİL ise, o zaman bir çıkarırsanız, imzalı bir sayının imzasız halini elde edersiniz, bu doğru değil mi?
MarcusJ

2
Belirli bitleri değiştirmeden önce temizlemek için bir bit maskesinde AND ile birlikte bitwise NOT kullanıyorum.
GWW

2
Birisi "imzasız-imzalı dönüşüm" hakkında soru sordu. Tarafından gerçekleştirilen işlem ~, ikili olumsuzlamanın bir biçimi olan "bir tamamlayıcısı" olarak da adlandırılır. Hemen hemen tüm modern bilgisayarlar ikinin tümleyen aritmetiğini kullanır, bu da bitsel ters artı birdir. Yani işaretli bir tamsayı değişkeni için x, tipik olarak bunun ~x + 1ile aynı değeri verdiğini göreceksiniz -x. Örneğin, makinemde printf("%hx %hx\n", -1234, ~1234 + 1)yazdırıyor fb2e fb2e.
Steve Summit

2
@MarcusJ Evet, kişinin tamamlayıcısı imzalı işaretsiz (işaretsiz-> işaretsiz) haline dönüştürmek için çalışır. (Değeri farklı şekilde bildirilmiş bir değişkene atamanın ve derleyicinin bu konuda endişelenmesine izin vermenin daha kolay olduğunu unutmayın.) Ancak , kısmen olası işaretsiz değerler daha geniş bir aralığı kapsadığından (işaretsiz-> işaretli) tam tersi çalışmaz. işaretli bir değişkenin içine sıkıştırılabileceğinden ve kısmen de sorunun, muhtemelen hangi işaretin icat edileceğini-dış bilgiden- belirtilmeden iyi tanımlanmadığı için. Zıt yönleri belirttikleri için iki yorumunuz farklı yanıtlar aldı.
Chuck Kollars

43

~bitsel NOT operatörüdür. İşlenenin bitlerini ters çevirir.

Örneğin, sahipseniz:

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

12

Bu bitsel NOT operatörüdür. Bir numaradaki tüm bitleri çevirir: 100110 -> 011001


8

Yaklaşık karakteri, bir tamsayının tüm bitlerini ters çevirmek için bir operatör olarak kullanılır (bit düzeyinde DEĞİL).

Örneğin: ~0x0044 = 0xFFBB.



1

Tilde operatörü (~) bitsel NOT operatörü olarak da adlandırılır , herhangi bir ikili sayının tümlemesini bağımsız değişken olarak gerçekleştirir. NOT işleneni ondalık sayı ise, onu ikili olarak dönüştürür ve birinin tamamlama işlemini gerçekleştirir.

Birinin tamamlayıcısını hesaplamak için tüm [0 -> 1] ve [1 -> 0] rakamlarını ters çevirin. Örn: 0101 = 5; ~ (0101) = 1010. Yaklaşık operatörü kullanımı: 1. Maskeleme işleminde kullanılır, Maskeleme herhangi bir register içindeki değerlerin ayarlanması ve sıfırlanması anlamına gelir. örneğin:

char mask ;
mask = 1 << 5 ;

Maskeyi 10000 ikili değere ayarlayacaktır ve bu maske diğer değişkenin içinde bulunan bit değerini kontrol etmek için kullanılabilir.

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

Buna bitlerin maskelenmesi adı verilir . 2. Maskeleme özelliklerini kullanarak herhangi bir sayının ikili eşdeğerini bulmak.

#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");
  }  
}

Çıktı: Ondalık 10, 00001010 ile aynıdır

Benim gözlemim : Herhangi bir veri türünün maksimum aralığı için, kişinin tamamlayıcısı, negatif değeri 1 ile karşılık gelen herhangi bir değere düşürür. örn:
~ 1 --------> -2
~ 2 ---------> -3
ve benzeri ... Bu gözlemi size küçük kod parçacığı kullanarak göstereceğim

#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

Not: Bu, yalnızca veri türü aralığı için geçerlidir. int veri türü anlamına gelir, bu kural yalnızca [-2.147.483.648 ila 2.147.483.647] aralığının değeri için geçerli olacaktır.
Teşekkür ederim ..... Bu size yardımcı olabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.