2013-04-07 7 views
12

मैंने पढ़ा है कि आप पॉइंटर्स पर बिटमैस्क नहीं कर सकते हैं, आप पॉइंटर्स पर बिटवाई ऑपरेशंस कैसे नहीं कर सकते हैं?सी में पॉइंटर पर आप बिटवाई ऑपरेशंस क्यों नहीं कर सकते हैं, और इसके आसपास कोई रास्ता है?

क्या कोई प्रभाव प्राप्त करने का कोई तरीका है?

क्या यह सी ++ पर भी लागू होता है?

+0

मैं इसके लिए आपके उपयोग के मामले के बारे में उत्सुक हूं। क्या आप विस्तार से समझा सकते हैं? –

+3

आप "प्रभाव" क्या हासिल करने की कोशिश कर रहे हैं? पॉइंटर्स पर बिट ऑपरेशन वास्तव में समझ में नहीं आता है। –

+0

अधिकांशतः गठबंधन आवंटन, जिसे वास्तव में अब भी आवश्यक नहीं है क्योंकि रनटाइम आम तौर पर आपके लिए यांत्रिकी प्रदान करता है। – WhozCraig

उत्तर

14

कारण आप बिटवाइंड पॉइंटर ऑपरेशंस नहीं कर सकते हैं क्योंकि मानक कहता है कि आप नहीं कर सकते हैं। मुझे लगता है कि मानक ऐसा क्यों कहता है क्योंकि बिटवाई पॉइंटर ऑपरेशंस लगभग सार्वभौमिक रूप से अपरिभाषित या (सर्वोत्तम रूप से) कार्यान्वयन-परिभाषित व्यवहार में परिणाम देगा। तो ऐसा कुछ भी नहीं होगा जो आप कर सकते हैं उपयोगी और पोर्टेबल, अतिरिक्त संचालन जैसे आसान संचालन के विपरीत होगा।

लेकिन आप कास्टिंग के साथ उसके चारों ओर प्राप्त कर सकते हैं:

#include <stdint.h> 

void *ptr1; 
// Find page start 
void *ptr2 = (void *) ((uintptr_t) ptr1 & ~(uintptr_t) 0xfff) 

सी ++ का सवाल है, तो बस के बजाय सी शैली डाले की reinterpret_cast का उपयोग करें।

+1

यह वास्तव में काफी परेशान है। सी, दशकों से अब ऑपरेटिंग सिस्टम और एम्बेडेड सिस्टम "उच्च स्तरीय" भाषा के रूप में जाना जाता है - आधारभूत स्तर पर मूल रूप से गैर-पोर्टेबल दोनों प्रकार के विकास, अभी भी उस भूमिका को गले लगाने से इनकार करते हैं जो अब सबसे उपयुक्त है।शुक्र है कि सी 99 अंततः कुछ कठोर पूर्णांक प्रकारों को पहचानता है, इस बात का कोई कारण नहीं है कि स्मृति प्रबंधन कोड को सरल मास्क ऑपरेशन करने के लिए प्रत्येक चर कई बार क्यों डालना है। – duanev

5

यह अस्वीकृत है क्योंकि अर्थशास्त्र वास्तव में अच्छी तरह से परिभाषित नहीं हैं। हालांकि, आप निश्चित रूप से ऐसा कर सकते हैं। बस uintptr_t पर डालें, ऑपरेशन करें और फिर पॉइंटर प्रकार में वापस डालें। वह सी ++ में भी काम करेगा।

4

आप पॉइंटर्स पर बिटवाई ऑपरेटरों का उपयोग नहीं कर सकते हैं क्योंकि मानक सूचकांक के प्रतिनिधित्व के बारे में बहुत कम आवश्यकताओं को लागू करते हैं और किसी विशेष सूचक को कितने मूल्यों का पता लगाया जा सकता है। तो उन ऑपरेटरों को पॉइंटर पर उपयोग करने का क्या मतलब होगा इसकी कोई परिभाषा नहीं है।

फिर भी, अधिकांश मशीनों पर अधिकांश कंपाइलर पॉइंटर के मान के रूप में स्मृति पते के स्पष्ट मैपिंग का उपयोग करते हैं। और उनमें से अधिकतर आपको एक अभिन्न प्रकार के लिए एक सूचक डालने देंगे। फिर आप मूल्य पर बिटवाई ऑपरेशंस कर सकते हैं, और इसे वापस पॉइंटर पर भी डाल सकते हैं। लेकिन यह सामान्य रूप से पोर्टेबल या अच्छी तरह से परिभाषित नहीं किया जाएगा।

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