सी

2011-08-26 4 views
79

में टिल्ड ऑपरेटर मैंने ईएलएफ हैशिंग एल्गोरिदम में उपयोग किए गए टिल्ड ऑपरेटर को देखा है, और मैं उत्सुक हूं कि यह क्या करता है। (कोड 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; 
} 

उत्तर

105

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

NOT 011100 
    = 100011 
+0

यह किस उद्देश्य से सेवा करेगा? मैंने सुना है कि आप इसे बिना हस्ताक्षरित -> हस्ताक्षरित रूपांतरण में उपयोग कर सकते हैं लेकिन मुझे नहीं पता कि कैसे? – MarcusJ

+1

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

+2

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

38

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

उदाहरण के लिए

, यदि आपके पास:

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

यह बिटवाइज़ नहीं ऑपरेटर है। यह एक संख्या में सभी बिट्स flips: 100,110 -> 011001

7

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

7

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

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

0

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

किसी के पूरक की गणना करने के लिए बस सभी अंक [0 -> 1] और [1 -> 0] पूर्व: 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 से कम नकारात्मक मूल्य प्रदान करते हैं। पूर्व:
~ 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 डेटा प्रकार के लिए यह नियम केवल सीमा के मूल्य के लिए लागू होगा [-2,147,483,648 से 2,147,483,647]।
धन्यवाद .....यह आपकी मदद कर सकता है