C में टिल्ड ऑपरेटर


95

मैंने ELF हैशिंग एल्गोरिथ्म में उपयोग किए जाने वाले टिल्ड ऑपरेटर को देखा है, और मैं उत्सुक हूं कि यह क्या करता है। (कोड अनंत काल से है ।)

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

जवाबों:


126

~ऑपरेटर बिटवाइज़ है नहीं है, यह एक द्विआधारी संख्या में बिट्स उलट:

NOT 011100
  = 100011

1
बिटवाइज़ नॉट कई चीजों के लिए उपयोगी है, उदाहरण के लिए, बिट मास्क। मुझे यकीन नहीं है कि हस्ताक्षरित पूर्णांक रूपांतरण के लिए अहस्ताक्षरित से आपका क्या मतलब है।
GWW

2
रुको, आप और बिटमस्क को नहीं चाहिए? यह है कि मेरा बिट रीडर इसे कैसे कर रहा है, लेकिन यह स्पर्श है। मैंने पढ़ा है कि अगर आपके पास एक्स है और नहीं है, तो एक को घटाएं आपको एक हस्ताक्षरित संख्या का अहस्ताक्षरित संस्करण मिलेगा, क्या यह सही नहीं है?
मार्कस जे।

2
मैं बिटवॉक का उपयोग नहीं करता हूं और उन्हें बदलने से पहले विशिष्ट बिट्स को साफ करने के लिए संयोजन के साथ बिटमास्क पर नहीं।
GWW

2
किसी ने "हस्ताक्षरित रूपांतरण के लिए अहस्ताक्षरित" के बारे में पूछा। द्वारा किए गए ऑपरेशन ~को "एक का पूरक" भी कहा जाता है, जो कि द्विआधारी नकार का एक रूप है। वस्तुतः सभी आधुनिक कंप्यूटर दो के पूरक अंकगणित का उपयोग करते हैं, जो कि बिटवाइज़ व्युत्क्रम है, प्लस एक है। तो एक हस्ताक्षरित पूर्णांक चर के लिए x, आप आमतौर पर पाएंगे कि ~x + 1जैसा ही मूल्य देता है -x। उदाहरण के लिए, मेरी मशीन पर printf("%hx %hx\n", -1234, ~1234 + 1)प्रिंट fb2e fb2e
स्टीव समिट

2
@MarcusJ हां, किसी के पूरक को हस्ताक्षरित को हस्तांतरित करने के लिए कार्य करता है (हस्ताक्षरित-> अहस्ताक्षरित)। (ध्यान दें कि यह अलग-अलग घोषित किए गए वैरिएबल को केवल मान प्रदान करना आसान है और संकलक को इसके बारे में चिंता करने दें।) लेकिन यह दूसरे तरीके से काम नहीं करता है (अहस्ताक्षरित-> हस्ताक्षरित), आंशिक रूप से क्योंकि संभव अहस्ताक्षरित मान एक व्यापक श्रेणी का है। की तुलना में एक हस्ताक्षरित चर में crammed किया जा सकता है, और आंशिक रूप से क्योंकि उस समस्या को अच्छी तरह से परिभाषित किए बिना परिभाषित नहीं किया गया है-बाहर की जानकारी के बिना संभवतः-क्या संकेत है। आपकी दो टिप्पणियों को अलग-अलग उत्तर मिले क्योंकि वे विपरीत दिशाओं को निर्दिष्ट करते हैं।
चक कोलारस

43

~बिटवाइज़र नहीं ऑपरेटर है। यह ऑपरेंड के बिट्स को निष्क्रिय करता है।

उदाहरण के लिए, यदि आपके पास:

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

12

यह बिटवाइज़ नहीं ऑपरेटर है। यह एक संख्या में सभी बिट्स को फ़्लिप करता है: 100110 -> 011001


8

टिल्ड चरित्र का उपयोग एक पूर्णांक के सभी बिट्स (बिटवाइज़ नहीं) को पलटने के लिए एक ऑपरेटर के रूप में किया जाता है।

उदाहरण के लिए ~0x0044 = 0xFFBB:।



1

टिल्ड ऑपरेटर (~) जिसे बिटवाइज़ NOT ऑपरेटर भी कहा जाता है, किसी भी बाइनरी नंबर के पूरक को तर्क के रूप में प्रदर्शित करता है। यदि ऑपरेंड नॉट दशमलव संख्या है तो इसे बाइनरी के रूप में परिवर्तित करते हैं और किसी के पूरक ऑपरेशन करते हैं।

किसी के पूरक की गणना करने के लिए बस सभी अंकों को उल्टा करें [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. 

इसे बिट्स की मास्किंग कहा जाता है । 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 से घटाकर किसी भी संबंधित मूल्य प्रदान करता है। ex:
~ 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

नोट: यह केवल डेटा प्रकार की सीमा के लिए मान्य है। इंट डेटा प्रकार के लिए यह नियम केवल सीमा के मान [-2,147,483,648 से 2,147,483,647] के लिए लागू होगा।
थैंक्यू ..... यह आपकी मदद कर सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.