2013-02-14 20 views
8

में कनवर्ट करें मैं दो बाइनरी तारों को वापस int में बदलने की कोशिश कर रहा हूं। हालांकि यह मेरे सभी बाइनरी तारों को परिवर्तित नहीं करता है, जिससे मुझे java.lang.NumberFormatException अपवाद छोड़ दिया जाता है।जावा: बाइनरी स्ट्रिंग को int

public class Bin { 

    public static void main(String argvs[]) { 
      String binaryString ; 
      binaryString = Integer.toBinaryString(~0); 
      //binaryString = Integer.toBinaryString(~1); 
      //binaryString = "1010" ; 
      int base = 2; 
      int decimal = Integer.parseInt(binaryString, base); 
      System.out.println("INPUT=" + binaryString + " decimal=" + decimal) ; 
    } 
} 

अगर मैं "1010" कन्वर्ट यह बहुत अच्छा काम करता है, लेकिन जब मैं अन्य दो में से एक बदलने की कोशिश मैं अपवाद: यहाँ 3 बाइनरी स्ट्रिंग के साथ अपने परीक्षण कोड है। क्या कोई मुझे समझा सकता है कि यह क्यों है?

चीयर्स

+0

एक अनुमान में, यह क्योंकि 'Integer.toBinaryString' अहस्ताक्षरित है और' Integer.parseInt' पर हस्ताक्षर किए है। –

+3

क्या आप वास्तव में यहां "कास्ट" का मतलब है? –

उत्तर

4

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#toBinaryString(int) से: toBinaryString() विधि की बाइनरी प्रतिनिधित्व में अपने इनपुट धर्मान्तरित "अहस्ताक्षरित पूर्णांक मान तर्क प्लस 2 अगर तर्क नकारात्मक है है।"

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int) से: parseInt() विधि NumberFormatException फेंकता है तो "स्ट्रिंग के प्रतिनिधित्व वाले मान प्रकार int के एक मूल्य नहीं है।"

नोट दोनों ~0 और ~1 नकारात्मक हैं कि (-1 और -2 क्रमशः), तो -2 क्रमशः 2 -1 और 2 की बाइनरी अभ्यावेदन में परिवर्तित हो जाएगा, जिनमें से न तो किया जा सकता है int के मान में दर्शाया गया है, इसलिए NumberFormatException जो आप देख रहे हैं।

+0

तो हम इसे कैसे ठीक कर सकते हैं? – TastyLemons

+1

दो साल और जावा 8 में एक 'Integer.parseUnsignedInt' विधि है जो अच्छी तरह से चाल करेगी और आपको वापस आईएनपीयूटी = 11111111111111111111111111111111 दशमलव = -1' ('Long.parseLong' जैसा कि नीचे वर्णित है एडी द्वारा प्री-जावा 8) –

1

"~ 0" के लिए बिट्स 11111111111111111111111111111111 (32 1) हैं। आम तौर पर, यह संख्या -1 का प्रतिनिधित्व करता है। "~ 1" के लिए बिट्स 11111111111111111111111111111110 (31 1 के बाद शून्य) हैं। आम तौर पर, यह संख्या -2 का प्रतिनिधित्व करता है।

मैंने parseInt में उच्चतम हस्ताक्षरित पूर्णांक का प्रतिनिधित्व करने वाले "01111111111111111111111111111111" (0 और 31 1) की कोशिश की, और कोई त्रुटि नहीं हुई। लेकिन मैंने "10000000000000000000000000000000" की कोशिश की, जो न्यूनतम हस्ताक्षरित पूर्णांक का प्रतिनिधित्व करता है, और फिर त्रुटि हुई।

parseInt विधि इनपुट में एक "-" उम्मीद करने के लिए प्रतीत होता है कि ऋणात्मक संख्या वांछित है। ऐसा लगता है कि यह विधि पूर्णांक में अतिप्रवाह का पता लगा रही है और NumberFormatException फेंक रही है।

6

जैसा कि ऊपर बताया गया है, Integer.toBinaryString() ~ 0 और ~ 1 को बिना हस्ताक्षरित int में परिवर्तित करता है ताकि वे Integer.MAX_VALUE से अधिक हो जाएंगे।

आप लंबे समय तक पार्स का उपयोग कर सकते हैं और नीचे की ओर int में परिवर्तित कर सकते हैं।

int base = 2; 
for (Integer num : new Integer[] {~0, ~1}) { 
    String binaryString = Integer.toBinaryString(num);    
    Long decimal = Long.parseLong(binaryString, base); 
    System.out.println("INPUT=" + binaryString + " decimal=" + decimal.intValue()) ; 
} 
संबंधित मुद्दे