2010-09-28 10 views
9

मुझे दो पूर्ण पूरक प्रारूप में बाइट्स को सकारात्मक पूर्णांक बाइट्स में कनवर्ट करने की आवश्यकता है। रेंज 127 तक -128 255.दो का पूरक रूपांतरण

Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc. 

संपादित को 0 से मैप किया गया भ्रम स्पष्ट करने के लिए, इनपुट बाइट (बेशक) है 255 से सीमा 0 में एक अहस्ताक्षरित पूर्णांक लेकिन यह प्रतिनिधित्व करता दो के पूरक प्रारूप का उपयोग कर श्रेणी -128 से 127 में एक हस्ताक्षरित पूर्णांक। उदाहरण के लिए, 128 (बाइनरी 10000000) का इनपुट बाइट मान वास्तव में -128 का प्रतिनिधित्व करता है।

अतिरिक्त संपादित करें ठीक है, मान लें कि हमारे पास निम्नलिखित बाइट स्ट्रीम 0,255,254,1,127 है। दो के पूरक प्रारूप में यह 0, -1, -2, 1, 127 का प्रतिनिधित्व करता है। मुझे 0 से 255 रेंज पर क्लैंपिंग की आवश्यकता है। और जानकारी के लिए इस मुश्किल लगता करने लेख पढ़ें: Two's complement

+2

'byte' हस्ताक्षरित नहीं है, आप क्या करना चाहते हैं? – leppie

+0

मुझे अभी भी पूरी तरह से यकीन नहीं है कि यहां क्या प्रयास किया गया है। या तो यह वही तरीका है जो सभी उत्तरों आपको देता है, या आप 2 के पूरक प्रतिनिधित्व को गलत तरीके से समझ रहे हैं। – leppie

उत्तर

7

से आप इनपुट नमूना आप बस चाहते हैं:

sbyte something = -128; 

byte foo = (byte)(something + 128); 
+0

कृपया मेरे संपादन देखें। आशा है कि अब यह स्पष्ट है। – Yehonatan

+3

@Yehonatan: लेकिन आप 0 से 255 रेंज में -1 का प्रतिनिधित्व कैसे करना चाहते हैं? – leppie

0

आप (आपके नंबर पर एक पूर्वाग्रह जोड़ने के रूप में सरल कुछ का वर्णन किया जा सकता है इस मामले में, हस्ताक्षर किए गए नंबर पर 128 जोड़ना)।

+0

अगर यह केवल इतना आसान था। – Yehonatan

6
new = old + 128; 

बिंगो :-)

+9

क्योंकि मुझे 'बिंगो' कीवर्ड नहीं मिला, मैंने आपके उत्तर को पठनीयता के लिए संपादित किया है :-) – paxdiablo

+0

क्या मूल बाइट मान 'पुराना' है या इसका रूपांतरण? यदि इसका मूल बाइट मान है तो यह गलत जवाब देता है। यदि बाद वाला यह प्रक्रिया है तो मैं यही पूछ रहा हूं। – Yehonatan

0

अगर मैं सही ढंग undestood, आपकी समस्या को कैसे इनपुट, जो वास्तव में एक signed-byte (sbyte) है परिवर्तित करने के लिए है, लेकिन यह भी एक इनपुट unsigned integer में संग्रहीत किया जाता है, और फिर शून्य को परिवर्तित करके नकारात्मक मानों से बचें।

स्पष्ट होने के लिए, जब आप एक हस्ताक्षरित प्रकार (जैसे ubyte) का उपयोग करते हैं, तो फ्रेमवर्क दृश्य के पीछे Two's complement का उपयोग कर रहा है, इसलिए केवल सही प्रकार पर कास्टिंग करके आप दो पूरक का उपयोग करेंगे।

फिर, एक बार जब आप रूपांतरण कर लेंगे, तो आप नकारात्मक मानों को एक साधारण if या एक सशर्त टर्नरी ऑपरेटर (?:) के साथ क्लैंप कर सकते हैं।

कार्यों नीचे प्रस्तुत मूल्यों from 128 to 255 (या -128 से -1) के लिए 0 वापस आ जाएगी, और मूल्यों from 0 to 127 के लिए the same value

इसलिए, यदि आप चाहिए इनपुट और आउटपुट के रूप में उपयोग अहस्ताक्षरित पूर्णांकों आप कुछ इस तरह इस्तेमाल कर सकते हैं:

private static uint ConvertSByteToByte(uint input) 
{ 
    sbyte properDataType = (sbyte)input; //128..255 will be taken as -128..-1 
    if (properDataType < 0) { return 0; } //when negative just return 0 
    if (input > 255) { return 0; } //just in case as uint can be greater than 255 
    return input; 
} 

या, IMHO, आप डेटा प्रकार सबसे अच्छा के लिए अनुकूल करने के लिए अपने इनपुट और आउटपुट को बदल सकता है अपने इनपुट और आउटपुट (sbyte और बाइट):

private static byte ConvertSByteToByte(sbyte input) 
{ 
    return input < 0 ? (byte)0 : (byte)input; 
} 
2

प्रयास करें

sbyte signed = (sbyte)input; 

या

int signed = input | 0xFFFFFF00; 
1
public static byte MakeHexSigned(byte value) 
    { 
     if (value > 255/2) 
     { 
      value = -1 * (255 + 1) + value; 
     } 

     return value; 
    } 
1
int8_t indata; /* -128,-127,...-1,0,1,...127 */ 
uint8_t byte = indata^0x80; 

XOR MSB, वह सब

+2

यह 'मेरे लिए सी # की तरह नहीं दिखता है – reggaeguitar

0

मुझे विश्वास है कि 2s बाइट्स की जाएगी सबसे अच्छा निम्नलिखित के साथ किया पूरक है। शायद सुरुचिपूर्ण या छोटा लेकिन स्पष्ट और स्पष्ट नहीं है। मैं इसे अपने उपयोग वर्गों में से एक में एक स्थिर विधि के रूप में रखूंगा।

public static sbyte ConvertTo2Complement(byte b) 
{ 
    if(b < 128) 
    { 
     return Convert.ToSByte(b); 
    } 
    else 
    { 
     int x = Convert.ToInt32(b); 
     return Convert.ToSByte(x - 256); 
    } 
} 
1

8-बिट्स से बड़ी संख्या के लिए, इस समस्या के लिए मेरा समाधान यहां है। मेरा उदाहरण 16-बिट मान के लिए है। नोट: यह देखने के लिए कि क्या यह नकारात्मक है या नहीं, आपको पहली बार जांच करनी होगी।

कदम:

  1. Convert # चर से पहले '~' रखकर तारीफ करने के लिए। (यानी। Y = ~ y)

  2. , चरित्र सरणी

  3. में

  4. तोड़ द्विआधारी तार बाइनरी स्ट्रिंग में कनवर्ट # से सही सबसे अधिक मूल्य के साथ शुरू 1 जोड़ने के लिए, किया जाता है का ट्रैक रखने के। चरित्र सरणी में स्टोर परिणाम।

  5. वर्ण सरणी को वापस स्ट्रिंग में कनवर्ट करें।

    private string TwosComplimentMath(string value1, string value2) 
    { 
        char[] binary1 = value1.ToCharArray(); 
        char[] binary2 = value2.ToCharArray(); 
        bool carry = false; 
        char[] calcResult = new char[16]; 
    
        for (int i = 15; i >= 0; i--) 
        { 
         if (binary1[i] == binary2[i]) 
         { 
          if (binary1[i] == '1') 
          { 
           if (carry) 
           { 
            calcResult[i] = '1'; 
            carry = true; 
           } 
           else 
           { 
            calcResult[i] = '0'; 
            carry = true; 
           } 
          } 
          else 
          { 
           if (carry) 
           { 
            calcResult[i] = '1'; 
            carry = false; 
           } 
           else 
           { 
            calcResult[i] = '0'; 
            carry = false; 
           } 
          } 
         } 
         else 
         { 
          if (carry) 
          { 
           calcResult[i] = '0'; 
           carry = true; 
          } 
          else 
          { 
           calcResult[i] = '1'; 
           carry = false; 
          } 
         } 
    
        } 
    
        string result = new string(calcResult); 
        return result; 
    
    } 
    

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

  • कोई संबंधित समस्या नहीं^_^