सी में, मेरे पास 32-बिट शब्द एक पता का प्रतिनिधित्व करता है (और मैंने इसे एक हस्ताक्षरित लंबे समय में संग्रहीत किया है, उम्मीद है कि यह ठीक है)। अब जो मैं इकट्ठा करता हूं, उस पते के भाग में पृष्ठ संख्या होती है और दूसरे भाग में ऑफसेट होता है। मैं सोच रहा था कि मैं केवल उन बिट्स को निकाल सकता हूं जो मुझे पृष्ठ संख्या देते हैं। मैंने पहले ही काम किया है कि पहले 22 सबसे महत्वपूर्ण बिट पेज नंबर हैं और अन्य 10 बिट पेज ऑफसेट हैं। मैं केवल पृष्ठ संख्या वाले बिट्स को कैसे पकड़ सकता हूं? मैं सोच रहा हूं कि मैं इसे थोड़ा सा संचालन के साथ कर सकता हूं, लेकिन मुझे यकीन नहीं है कि कैसे।बिट्स निकालने
उत्तर
bitshift ऑपरेटरों का उपयोग करने के लिए आपको आवश्यक बिट्स निकालने के लिए उपयोग करें।
pageNumber = x >> 10;
offset = x & ((1 << 10) - 1);
पेज संख्या के लिए, >> ऑपरेटर बिट्स बदलाव नीचे है, तो आप कम से कम signifcant बिट्स खो देते हैं।
ऑफसेट के लिए, ((< 10) - 1) 10 बिट्स युक्त बिटमैस्क बनाता है जिसका उपयोग केवल 10 कम महत्वपूर्ण बिट्स चुनने और सबसे महत्वपूर्ण बिट्स को अनदेखा करने के लिए किया जाता है।
आपके हार्डवेयर को अंकगणित (साइन-विस्तार) सही शिफ्ट करने पर, यदि आप उन्हें स्थानांतरित करने के बाद बिट्स को मुखौटा करने के लिए इस तरह के कोड पर एक अच्छा विचार हो सकते हैं। pagenumber = (x >> 10) और ((1 << 22) - 1); –
मैं फील्ड निष्कर्षण की "दो बदलाव" विधि का एक बड़ा प्रशंसक हूं। यह हस्ताक्षरित और हस्ताक्षरित दोनों काम करता है। word
से कम से कम महत्वपूर्ण बिट lsb
साथ चौड़ाई w
के एक क्षेत्र को निकालने के लिए:
#define BITSIN(W) (8*sizeof(W))
return (word << (BITSIN(word) - (lsb+width))) >> (BITSIN(word) - width);
इस मामले में, BITSIN(word) == 32
और lsb+width == 32
, इसलिए जब तक सवाल में शब्द अहस्ताक्षरित है के रूप में, तुम बस मास्किंग बिना सही 10 बदल सकते हैं।
एक चेतावनी: 32-बिट प्रकारों पर 32-बिट बदलावों से सावधान रहें! सी मानक कंपाइलर को कुछ भी करने देता है, और सामान्य इंटेल चिप्स क्या उपयोगी नहीं है: x << y
शिफ्ट x
y % 32
बिट्स द्वारा छोड़ा गया (प्रदान किया गया x
में 32-बिट पूर्णांक प्रकार है)। इसका अर्थ यह है कि यदि आप 32 बिट्स द्वारा 32-बिट पूर्णांक को बाएं या दाएं स्थानांतरित करने का प्रयास करते हैं, तो परिणाम नो-ऑप जैसा ही होता है। 64-बिट प्रकारों के 64-बिट बदलावों के साथ एक समान समस्या है।
"सामान्य इंटेल चिप्स क्या उपयोगी नहीं है" - वे क्या करते हैं? – AShelly
@ASHelly: अच्छा सवाल; मैंने जवाब संपादित किया। कौन जानता है, यह मुझे एक अपवित्र हो सकता है :-) –
अच्छा सवाल - मुझे यह लिखने की ज़रूरत है कि मैं एक डिस्सेबलर के लिए भी लिख रहा हूं। – new123456