2011-08-25 13 views
21

स्काला हेक्स और ऑक्टल अंक उपयोग करने के लिए प्रत्यक्ष समर्थन हासिल है:स्कैला में बाइनरी अक्षर कैसे लिखें?

scala> 01267 + 0100 
res1: Int = 759 

scala> 0x12AF + 0x100 
res2: Int = 5039 

लेकिन कैसे आप स्काला में एक द्विआधारी संख्या के रूप में एक पूर्णांक व्यक्त करते हैं?।

+2

ध्यान दें कि 2.10 के रूप में, एक प्रमुख 0 का उपयोग ऑक्टल का मतलब बहिष्कृत किया गया है। – AmigoNico

उत्तर

19

यदि प्रदर्शन कोई समस्या नहीं है, तो आप एक स्ट्रिंग का उपयोग कर सकते हैं और इसे एक पूर्णांक में परिवर्तित कर सकते हैं।

val x = Integer.parseInt("01010101", 2) 

बाइनरी संख्या भाग में सीधे समर्थित नहीं हैं क्योंकि आप आसानी से हेक्साडेसिमल से परिवर्तित कर सकते हैं बाइनरी और ठीक इसके विपरीत। अपना कोड साफ़ करने के लिए, आप बाइनरी नंबर को एक टिप्पणी में डाल सकते हैं।

val x = 0x55 //01010101 
4

यदि आप इसका उपयोग करने की योजना बना रहे हैं तो आप व्यवहार को एक निहित रूपांतरण के साथ अनुकरण कर सकते हैं।

object Extensions { 
    implicit def conversion(x: Int) = new BinaryInt(x) 
    class BinaryInt(x: Int) { 
    def b = { 
     // Conversion code like Integer.parseInt 
     // as Kim suggested 
    } 
    } 
} 

अब आप की तरह

import Extensions._ 
val x = 0101.b 
// or 
val x = 5.b 

आप खुद के लिए तय करने के लिए है, जो दिशा रूपांतरण जाना चाहिए सामान कर सकते हैं।

+4

सावधान रहें: '0101' एक ऑक्टल संख्या है! – soc

+0

यह 2.10 तक था। अन्य टिप्पणियां देखें। –

6

यदि आप एक पूर्णांक से परिवर्तित हो रहे हैं जो बाइनरी जैसा दिखता है तो @agilesteel सुझाव देता है तो आपको सावधान रहना होगा। उदाहरण के लिए 0101.b 65 दशमलव को बाइनरी (प्रारंभिक 0 संकेतक ऑक्टल) में परिवर्तित करने का प्रयास करेगा, जबकि 101.b 101 दशमलव को बाइनरी में परिवर्तित करने का प्रयास करेगा। यह केवल स्ट्रिंग से कनवर्ट करने का प्रयास करने के लिए वास्तव में समझ में आता है, जिसके लिए Integer.parseInt है, और एक संख्या से द्विआधारी स्ट्रिंग प्रस्तुति के लिए, जिसके लिए Integer.toString(x, 2) है।

मैं प्रोग्रामेटिक बाइनरी साहित्य के लिए बहुत से उपयोग-मामलों के बारे में नहीं सोच सकता। उस ने कहा, उनके पास made it to Java 7 उपसर्ग 0b के साथ एक संख्या के रूप में है, इसलिए मुझे आश्चर्य होगा कि अगर वे जल्द ही स्कैला में नहीं दिखाई देते थे। ऐसा लगता है कि जावा ने 15 साल तक उनके बिना ठीक किया है।

implicit class IntToBase(val digits:String) extends AnyVal { 
    def base(b:Int) = Integer.parseInt(digits, b) 
    def b = base(2) 
    def o = base(8) 
    def x = base(16) 
} 

आप काम करने के लिए अनुमति देता है कि:

+9

जावा ने बिना हस्ताक्षर किए गए वर्णों या सभ्य बिटवाई ऑपरेटरों के बिना "ठीक" किया है। "ठीक" से, मेरा मतलब है कि लोग केवल लिखित सामानों को छोड़ देते हैं जिन्हें जावा में इसकी आवश्यकता होती है, या फिर जावा के हर इंच जावा को शाप देना पड़ता है। –

8

नई 'निहित वर्ग "और 2.10 में" मूल्य वर्ग "तंत्र का उपयोग करके आप ऑब्जेक्ट निर्माण की भूमि के ऊपर के बिना सुविधा के तरीकों को जोड़ने के लिए कुछ इस तरह लिख सकते हैं

"555".o // 365 decimal 

और कोई IntToBase ऑब्जेक्ट वास्तव में कभी नहीं बनाया गया है।

18

2.10 में आप इसके लिए एक स्ट्रिंग इंटरपोलेटर बना सकते हैं, उदा। b"0010" लिखने के लिए 2 लिखना संभव है। मैक्रोज़ का उपयोग करके आप संबंधित रनटाइम ओवरहेड से छुटकारा पा सकते हैं और संकलन-समय पर रूपांतरण कर सकते हैं। कार्रवाई में यह देखने के लिए जेसन Zaugg के macrocosm पर एक नज़र डालें:

scala> b"101010" 
res4: Int = 42 

scala> b"102" 
<console>:11: error: exception during macro expansion: invalid binary literal 
       b"102" 
      ^
0

आप एक इंट की बाइनरी प्रतिनिधित्व आप 4.toBinaryString कॉल कर सकते हैं की एक स्ट्रिंग प्राप्त करना चाहते हैं। पैडिंग अधिक कठिन है। आपको कुछ ऐसा करना होगा: 4.toBinaryString.reverse.padTo(8, "0").reverse.mkString

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