जवाबों:
क्योंकि सीपीयू किसी बाइट से छोटे को संबोधित नहीं कर सकता है।
bt
, bts
, btr
और btc
कर सकते हैं एक बिट को संबोधित!
bt
एक बाइट ऑफसेट को संबोधित करता है और फिर किसी दिए गए ऑफसेट पर बिट का परीक्षण करता है, फिर भी, जब आप एक पते को बाइट्स में निर्दिष्ट करते हैं, तो निर्दिष्ट करें ... बिट ऑफ़सेट शाब्दिकों को थोड़ा वर्डी मिलेगा ( दण्ड का बहाना)।
से विकिपीडिया :
ऐतिहासिक रूप से, एक बाइट एक कंप्यूटर में पाठ के एकल वर्ण को एन्कोड करने के लिए उपयोग की जाने वाली बिट्स की संख्या थी और यह इस कारण से कई कंप्यूटर आर्किटेक्चर में मूल पता योग्य तत्व है।
तो बाइट है बुनियादी पता इकाई है, जो नीचे कंप्यूटर वास्तुकला का पता नहीं कर सकते। और चूंकि वहाँ (शायद) ऐसे कंप्यूटर मौजूद नहीं हैं जो 4-बिट बाइट का समर्थन करते हैं, आपके पास 4-बिट आदि नहीं हैं । bool
हालाँकि, यदि आप ऐसे आर्किटेक्चर को डिज़ाइन कर सकते हैं जो 4-बिट को मूल पते योग्य इकाई के रूप में संबोधित कर सकता है, तो आपके पास bool
आकार 4-बिट का होगा, केवल उस कंप्यूटर पर!
int
और char
मेरी पोस्ट से।
bool
भी नहीं हो सकता है , क्योंकि char
सबसे छोटी पता योग्य इकाई है C ++ में है , चाहे आर्किटेक्चर अपने स्वयं के ऑपकोड के साथ पता कर सकता है। sizeof(bool)
कम से कम 1 का मान होना चाहिए, और आस-पास की bool
वस्तुओं का C ++ में अपना पता होना चाहिए , इसलिए कार्यान्वयन को बस उन्हें बड़ा और बेकार स्मृति बनाना है। यही कारण है कि बिट फ़ील्ड एक विशेष मामले के रूप में मौजूद हैं: किसी संरचना के बिटफील्ड सदस्यों को अलग से पता करने की आवश्यकता नहीं होती है, इसलिए वे एक से छोटे हो सकते हैं char
(हालांकि पूरी संरचना अभी भी नहीं हो सकती है)।
char
है कि C ++ में सबसे छोटी पता योग्य इकाई है?
sizeof(bool)
से 0.5 नहीं हो सकता है :-) मुझे लगता है कि एक कार्यान्वयन कानूनी तौर पर उप-बाइट पॉइंटर्स को एक विस्तार के रूप में प्रदान कर सकता है, लेकिन "साधारण" ऑब्जेक्ट्स जैसे कि बूल, सामान्य तरीके से आवंटित किए गए हैं, उन्हें वही करना होगा जो मानक कहते हैं।
सबसे आसान जवाब है; यह इसलिए है क्योंकि सीपीयू बाइट्स में मेमोरी को संबोधित करता है और बिट्स में नहीं, और बिटवाइज़ ऑपरेशन बहुत धीमा है।
हालाँकि C ++ में बिट-साइज़ आवंटन का उपयोग करना संभव है। एसटीडी :: बिट वैक्टर के लिए वेक्टर विशेषज्ञता, और बिट आकार की प्रविष्टियां लेने वाली संरचनाएं भी हैं।
पुराने दिनों में वापस जब मुझे स्कूल जाने के लिए तेजस्वी बर्फ़ीला तूफ़ान, दोनों तरह से ऊपर उठना पड़ता था, और दोपहर का भोजन जो भी जानवर हम स्कूल के पीछे जंगल में ट्रैक कर सकते थे और अपने नंगे हाथों से मार सकते थे, कंप्यूटर की तुलना में बहुत कम स्मृति उपलब्ध थी आज। पहला कंप्यूटर जो मैंने कभी इस्तेमाल किया था उसमें 6K RAM था। 6 मेगाबाइट नहीं, 6 गीगाबाइट नहीं, 6 किलोबाइट। उस वातावरण में, आपने बहुत से बूलियनों को इंट के रूप में पैक करने के लिए बहुत समझदारी की है और इसलिए हम नियमित रूप से उन्हें बाहर निकालने और अंदर डालने के लिए ऑपरेशन का उपयोग करेंगे।
आज, जब लोग आपको केवल 1 जीबी रैम होने के लिए मजाक करेंगे, और एकमात्र जगह जिसे आप 200 जीबी से कम के साथ एक हार्ड ड्राइव पा सकते हैं, एक प्राचीन दुकान पर है, यह सिर्फ बिट्स को पैक करने की परेशानी के लायक नहीं है।
आपके पास 1-बिट बूल और 4 और 2-बिट इनट्स हो सकते हैं। लेकिन यह बिना किसी प्रदर्शन के लाभ के लिए एक अजीब निर्देश सेट होगा क्योंकि यह वास्तुकला को देखने के लिए एक अप्राकृतिक तरीका है। यह वास्तव में उस अप्रयुक्त डेटा को पुनः प्राप्त करने की कोशिश करने के बजाय एक बाइट का एक बेहतर हिस्सा "बेकार" करने के लिए समझ में आता है।
एकमात्र ऐप जो मेरे अनुभव में, एक ही बाइट में कई बूल पैक करने के लिए परेशान करता है, वह है Sql Server।
सब-साइज़ के पूर्णांक प्राप्त करने के लिए आप बिट फ़ील्ड का उपयोग कर सकते हैं।
struct X
{
int val:4; // 4 bit int.
};
हालांकि इसका उपयोग आमतौर पर संरचनाओं को सटीक हार्डवेयर अपेक्षित बिट पैटर्न में मैप करने के लिए किया जाता है:
struct SomThing // 1 byte value (on a system where 8 bits is a byte
{
int p1:4; // 4 bit field
int p2:3; // 3 bit field
int p3:1; // 1 bit
};
bool
एक बाइट हो सकता है - सीपीयू का सबसे छोटा पता योग्य आकार, या बड़ा हो सकता है। प्रदर्शन उद्देश्यों bool
के int
लिए इसका आकार होना असामान्य नहीं है। यदि विशिष्ट उद्देश्यों के लिए (हार्डवेयर सिमुलेशन कहते हैं) आपको एन बिट्स के साथ एक प्रकार की आवश्यकता है, तो आप उसके लिए एक पुस्तकालय पा सकते हैं (जैसे जीबीएल पुस्तकालय में BitSet<N>
कक्षा है)। यदि आप आकार से चिंतित हैं bool
(आपके पास शायद एक बड़ा कंटेनर है), तो आप अपने आप को बिट्स पैक कर सकते हैं, या इसका उपयोग कर सकते हैं std::vector<bool>
जो आपके लिए करेगा (बाद वाले से सावधान रहें, क्योंकि यह कंटेनर की आवश्यकता को पूरा नहीं करता है)।
क्योंकि सामान्य तौर पर, CPU मूल इकाई के रूप में 1 बाइट के साथ मेमोरी आवंटित करता है, हालांकि कुछ CPU जैसे MIPS में 4-बाइट शब्द का उपयोग किया जाता है।
हालांकि एक विशेष फैशन में vector
सौदों bool
, vector<bool>
प्रत्येक बूल के लिए एक बिट आवंटित किया जाता है।
lw
/ sw
बहुत अधिक व्यापक रूप से उपयोग किए जाते हैं।
बाइट कंप्यूटर की डिजिटल डेटा स्टोरेज की छोटी इकाई है। एक कंप्यूटर में RAM में लाखों बाइट्स हैं और उनमें से किसी का भी पता है। अगर यह हर बिट के लिए एक पता होता है तो एक कंप्यूटर 8 बार कम रैम का प्रबंधन कर सकता है कि यह क्या कर सकता है।
अधिक जानकारी: विकिपीडिया
यहां तक कि जब न्यूनतम संभव आकार 1 बाइट है, तो आपके पास 1 बाइट पर बूलियन जानकारी के 8 बिट्स हो सकते हैं:
http://en.wikipedia.org/wiki/Bit_array
जूलिया भाषा में उदाहरण के लिए BitArray है, और मैं C ++ कार्यान्वयन के बारे में पढ़ता हूं।
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
। अधिकांश संकलक एक पूर्ण आवंटित करेंगेunsigned int
, हालांकि जब आप पढ़ते / लिखते हैं तो वे खुद से बिट-ट्विडलिंग से निपटते हैं। इसके अलावा वे खुद के साथ काम करते हैं modulo संचालन। यह एकunsigned small : 4
विशेषता है 0 और 15 के बीच एक मान है, और जब यह 16 को मिलना चाहिए, तो यह पूर्ववर्ती बिट को अधिलेखित नहीं करेगा :)