2009-01-27 20 views

उत्तर

23
sub bin2dec { 
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32))); 
} 
+3

हर उपकरण मैं पूछता हूँ मुझसे कहता है कि 111111111111111111111111111111111 8589934591. करने के लिए अनुवाद बस कैसे यकीन कर रहे हैं आपको लगता है कि 42949672958589934591 सही है? – innaM

+2

यह अंतर्निहित ऑक्टेट() द्वारा भी किया जाता है, हालांकि यह इसके लिए एक बहुत खराब नाम है। –

56

मेरे पसंदीदा तरीका है:

$x_num = oct("0b" . $x_bin); 

man perlfunc से हवाला देते हुए:

 
    oct EXPR 
    oct  Interprets EXPR as an octal string and returns the 
      corresponding value. (If EXPR happens to start 
      off with "0x", interprets it as a hex string. If 
      EXPR starts off with "0b", it is interpreted as a 
      binary string. Leading whitespace is ignored in 
      all three cases.) 
+1

वह है ... चौंकाने वाला। धन्यवाद। – innaM

+0

@edg: 32 बिट प्लेटफ़ॉर्म पर इसकी अपेक्षा की जा सकती है; पोर्टेबिलिटी चेतावनी के बावजूद 64 बिट्स के साथ मेरे लिए काम करता है। – ysth

+2

मैं हमेशा पैक का उपयोग करता था, लेकिन मैंने बस पैक, ऑक्टेट, और बिट :: वेक्टर का बेंचमार्क किया और यह तीनों में से सबसे तेज़ है। यह बिट :: वेक्टर से 1449% तेज है और मेरे सिस्टम पर पैक से 316% तेज है। – gpojd

12

हमेशा की तरह, वहाँ भी एक उत्कृष्ट CPAN मॉड्यूल है कि यहाँ उल्लेख किया जाना चाहिए है है: Bit::Vector

परिवर्तन कुछ इस तरह दिखेगा:

use Bit::Vector; 

my $v = Bit::Vector->new_Bin(32, '0001001100101'); 
print "hex: ", $v->to_Hex(), "\n"; 
print "dec: ", $v->to_Dec(), "\n"; 

द्विआधारी तार लगभग किसी भी लम्बाई के हो सकता है और आप थोड़ा-स्थानांतरण जैसे अन्य स्वच्छ सामान, आदि

6

वास्तव में क्या कर सकते हैं आप बस कर सकते हैं सामने '0 बी' छड़ी और इसे बाइनरी संख्या के रूप में माना जाता है।

perl -le 'print 0b101' 
5 

लेकिन यह केवल एक शब्दकोष के लिए काम करता है।

0

आप नंगे शब्द प्रतिबंध के आसपास काम करने के लिए eval() विधि का उपयोग कर सकते हैं:

eval "\$num=0b$str;"; 
संबंधित मुद्दे

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