2009-01-27 50 views

Trả lời

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

Mỗi công cụ tôi hỏi nói với tôi rằng 111111111111111111111111111111111 dịch để 8589934591. Chỉ cần như thế nào chắc chắn là bạn rằng 42949672958589934591 là đúng? – innaM

+2

Điều này được thực hiện bởi oct() được xây dựng sẵn, mặc dù nó là một tên khá nghèo cho nó. –

56

cách ưa thích của tôi là:

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

Trích dẫn từ 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

Đó là ... gây sốc. Cảm ơn bạn. – innaM

+0

@edg: đó là dự kiến ​​trên nền tảng 32 bit; làm việc cho tôi với 64 bit, mặc dù với một cảnh báo di động. – ysth

+2

Tôi luôn luôn sử dụng gói, nhưng tôi chỉ chuẩn gói, oct, và Bit :: Vector và điều này là bởi đến nay là nhanh nhất trong ba. Tốc độ nhanh hơn Bit :: Vector nhanh hơn 14% và nhanh hơn 316% so với gói trên hệ thống của tôi. – gpojd

12

Như thường lệ, cũng là một module CPAN xuất sắc nên được đề cập ở đây: Bit::Vector .

Việc chuyển đổi sẽ giống như thế này:

use Bit::Vector; 

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

Các chuỗi nhị phân có thể được gần như bất kỳ chiều dài và bạn có thể làm những thứ gọn gàng khác như bit chuyển vv

6

Trên thực tế bạn có thể chỉ dính '0b' ở mặt trước và nó được coi là số nhị phân.

perl -le 'print 0b101' 
5 

Nhưng điều này chỉ hoạt động đối với người gác.

0

Bạn có thể sử dụng phương pháp eval() để làm việc xung quanh những hạn chế trần từ:

eval "\$num=0b$str;"; 
Các vấn đề liên quan