2012-10-02 9 views
12

मैं एक बाइट से कुछ मूल्य पढ़ रहा हूं। मुझे उपयोगकर्ता मैनुअल में बताया गया है कि इस बाइट में 3 अलग-अलग मान हैं। वहाँ एक मेज है कि इस तरह दिखाई देता है:सी #, बिट्स और बाइट्स - मैं बाइट से बिट मान कैसे प्राप्त करूं?

bit table

मैं व्याख्या है कि अर्थ है परिशुद्धता 3 बिट्स तक ले जाता है, पैमाने अप 2 लेता है और आकार 8 (1 बाइट) के लिए कुल 3 लेता है।

क्या मैं पर स्पष्ट नहीं कर रहा हूँ है:

1 - क्यों यह बजाय 0 0 के माध्यम से 7 लेबल के माध्यम से 7

2 (कुछ शायद महत्व से कोई लेना देना?) है - मैं कैसे निकाल कर उस बाइट से अलग मूल्य?

उत्तर

17

यह प्रथागत है उनके महत्व के अनुसार बाइट में संख्या बिट्स के लिए: बिट x2^x का प्रतिनिधित्व करता है। इस नंबरिंग योजना के मुताबिक, कम से कम महत्वपूर्ण बिट संख्या शून्य हो जाती है, अगली बिट नंबर एक है, और इसी तरह।

अलग-अलग बिट्स हो रही एक पारी और एक मास्किंग आपरेशन की आवश्यकता है:

var size = (v >> 0) & 7; 
var scale = (v >> 3) & 3; 
var precision = (v >> 5) & 7; 

शिफ्ट सबसे दायीं ओर का भाग है कि आप मिल (शून्य से स्थानांतरण के लिए नजरअंदाज कर दिया है की जरूरत के अधिकार के लिए बिट्स की संख्या से, मैं इसे जोड़ा चित्रण प्रयोजनों के लिए)।

उच्चतम संख्या वाले मास्क जो कि आप प्राप्त करना चाहते हैं की संख्या में फिट बैठता है: 1 बिट के लिए 1, दो बिट्स के लिए 3, तीन बिट्स के लिए 7, 2^x-1x बिट्स के लिए।

+0

मुखौटा संख्या कैसे काम करता है इसके स्पष्टीकरण के लिए धन्यवाद। – bugfixr

+0

ऑपरेटर को अन्य तरीकों से रैंड करने का प्रयास करें: var size = ((v और 7) >> 0); var scale = ((v और 28) >> 3); var precision = ((v और 224) >> 5); – Robetto

3

1. हां, सबसे महत्वपूर्ण बिट आमतौर पर पहले लिखा जाता है। बाएं-बिट को 7 लेबल किया गया है क्योंकि जब बाइट को पूर्णांक के रूप में व्याख्या किया जाता है, तो उस बिट के मूल्य 2 (= 128) सेट होने पर मूल्य होता है।

यह पूरी तरह से प्राकृतिक है और वास्तव में यह है कि आप दशमलव संख्या कैसे लिखते हैं (सबसे महत्वपूर्ण अंक पहले)। उदाहरण के लिए, संख्या 356 (3 x 10 ) + (5 x 10 ) + (6 x 10 ) है।

2. पूरा होने के लिए, अन्य उत्तर में उल्लेख किया है के रूप में आप अलग-अलग मान निम्नानुसार बिट पारी और बिटवाइज़-और ऑपरेटर का उपयोग करके निकाल सकते हैं:

int size = x & 7; 
int scale = (x >> 3) & 3; 
int precision = (x >> 5) & 7; 

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

+0

हम एक अलग जवाब सवाल के हिस्सों। क्या हम एक उथल-पुथल या कुछ विभाजित करते हैं? : डी – Wug

4
  1. पोटाटो, पोटाहतो।

  2. आप परिवर्तन और मास्क का उपयोग करेंगे अवांछित बिट्स बाहर समतल, इस तरह की तरह:

    byte b = something; // b is our byte 
    
    int size = b & 0x7; 
    int scale = (b >> 3) & 0x3; 
    int position = (b >> 5) & 0x7; 
    
1

आप बिटवाइज़ गणित के माध्यम से ऐसा कर सकते हैं:

uint precision = (thatByte & 0xe0) >> 5, 
    scale = (thatByte & 0x18) >> 3, 
    size = thatByte & 7; 
6

आप परिवर्तन और मास्क कर सकते हैं, या आप BitArray वर्ग का उपयोग कर सकते हैं: BitVector32 साथ http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

उदाहरण:

BitVector32 bv = new BitVector32(0); 

var size = BitVector32.CreateSection(7); 
var scale = BitVector32.CreateSection(3, size); 
var precision = BitVector32.CreateSection(7, scale); 

bv[size] = 5; 
bv[scale] = 2; 
bv[precision] = 4; 

LINQPad उत्पादन:

LINQPad output

+0

+1 एक विकल्प को इंगित करने के लिए +1 जो सी: पी [बिटवॉक्टर 32] के दिनों में नहीं सुनता है (http://msdn.microsoft.com/en-us/library/system.collections.specialized.bitvector32.aspx) एक और विकल्प है, जो आपको अपने बिटकफील्ड को खंडों में विभाजित करने की अनुमति देता है (ओपी के आकार, स्केल और परिशुद्धता के अनुरूप) और इंडेक्सिंग सिंटैक्स का उपयोग करके उनमें से प्रत्येक को असाइन या पढ़ा जाता है। – shambulator

+0

यह एक लिंक उत्तर है। – Wug

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