2013-03-13 8 views
5

क्या कोई मदद कर सकता है n&-n का मतलब है ?? और इसका महत्व क्या है।सकारात्मक और नकारात्मक संख्या के bitwise और (&) का अर्थ?

+2

यह अनिर्धारित व्यवहार का कारण बन सकता है या परिणामस्वरूप 'n' के मूल्य और नकारात्मक संख्याओं का प्रतिनिधित्व (i। ई। 1 के पूरक बनाम 2 के पूरक) के आधार पर एक अनिर्दिष्ट और/या कार्यान्वयन परिभाषित मूल्य हो सकता है। मुझे यकीन है कि यह ऐसा कुछ है जिसे आप उपयोग/मुठभेड़ नहीं करना चाहते हैं। –

+0

मैंने कभी असली 1 की पूरक मशीन नहीं देखी है। –

+1

@ कथुलु, मेरे पास है लेकिन यह बहुत समय पहले था। सी ++ का आविष्कार अभी तक नहीं हुआ था। –

उत्तर

0

मेरा मानना ​​है कि यह पता लगाने के लिए एक चाल है कि एन 2 की शक्ति है या नहीं (एन == (एन -n)) आईएफएफ एन 2 (1,2,4,8) की शक्ति है।

+1

की तुलना में अधिक सिस्टमों में पोर्टेबल है, ठीक है कि यह पूरी तरह से काम नहीं करता है क्योंकि यह शून्य के लिए सच होगा, जिसे आम तौर पर दो की शक्ति नहीं माना जाता है। और चाल उस से अधिक उपयोगी है - अन्य उत्तरों देखें। – JasonD

+0

'(एनएंड (एन -1)) == 0' अधिक सरल होता। –

3

अधिकतर लोग वास्तव में हर प्रणाली की परवाह करते हैं, यह आपको 2 की उच्चतम शक्ति देगा जो एन समान रूप से विभाजित है।

+0

लेकिन सावधान रहें कि यह कार्यान्वयन परिभाषित व्यवहार पर निर्भर है, इसलिए तकनीकी पोर्टेबल नहीं है। – tletnes

+3

@tletnes पोर्टेबिलिटी एक सापेक्ष शब्द है। यह पोर्टेबल नहीं है जब तक सी ++ मानक का संबंध है, सच है। लेकिन यह संभवतः एक अनुरूप, या लगभग अनुरूप अनुरूप सी ++ कंपाइलर –

1

यह थोड़ा सा और संख्या का है। नकारात्मक संख्या two's complement के रूप में दर्शायी जाती है।

तो उदाहरण के लिए, बिटवाइज़ के लिए और के 7 & (-7) है x00000111 & x11111001 = x00000001 = 1

14

यह एक पुरानी चाल है कि यह में एक भी बिट, नीचे बिट है कि स्थापित किया गया था के साथ एक संख्या देता है n में। कम से कम दो पूरक गणित में, जो इन दिनों केवल सार्वभौमिक है।

कारण यह काम करता है: संख्या का नकारात्मक संख्या संख्या को परिवर्तित करके उत्पादित किया जाता है, फिर 1 जोड़ना (यह दो पूरक के परिभाषा है)। जब आप 1 जोड़ते हैं, तो सेट के नीचे से शुरू होने वाली प्रत्येक बिट अगले उच्च बिट में बहती है; एक बार जब आप शून्य बिट तक पहुंच जाते हैं तो यह बंद हो जाता है। उन अतिप्रवाह बिट्स सभी शून्य होंगे, और पिछले एक से ऊपर की बिट्स एक-दूसरे के विपरीत होंगी, इसलिए केवल थोड़ी सी बायीं तरफ है जो कैस्केड को रोकती है - वह जो 1 के रूप में शुरू हुई थी और 0

में उलटा गया था

पीएस आप किसी के पूरक गणित भर में चलाने के बारे में चिंतित हैं, तो यहाँ एक संस्करण है कि दोनों के साथ काम करता है:

n & (~n + 1) 
+0

हां, और यह आसान है अगर उदा। एक एन में सेट सभी बिट्स पर जल्दी से फिर से शुरू करना चाहता है; 'के लिए (; जे = एन &(-n); एन^= जे)' –

-2

रूप @aestrivex उल्लेख किया गया है, यह मैं इस

for (int y = x; y > 0; y -= y & -y) 
का सामना करना पड़ा 1.Even लेखन का एक तरीका है

और यह सिर्फ y का मतलब = y -1 क्योंकि
x00000111 (-7) है & x11111001 = x00000001 = 1

0

मैं 0,123,457 करने के लिए एक आत्म व्याख्यात्मक उदाहरण जोड़ना होगाका अद्भुत प्रदर्शन।

010010000 | +144 ~ 
----------|------- 
101101111 | -145 + 
     1 | 
----------|------- 
101110000 | -144 

101110000 | -144 & 
010010000 | +144 
----------|------- 
000010000 | 16` 
0

क्योंकि x & -x = {0, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 16, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 32} 32. 0 से x के लिए यह उछल करने के लिए कुछ अनुप्रयोगों के लिए दृश्यों के लिए प्रयोग किया जाता है। आवेदन संचित रिकॉर्ड स्टोर करने के लिए हो सकता है।

for(;x < N;x += x&-x) { 
    // do something here 
    ++tr[x]; 
} 

पाश बहुत तेजी से पार करता है क्योंकि यह कूदने के लिए दो की अगली सत्ता के लिए लग रहा है।

संबंधित मुद्दे