請問如何轉換成二進位?

若有一字串

$a = "76543210";

如果字串 $a 為八進位如何轉換成二進位?

如果字串 $a 為十進位如何轉換成二進位?

如果字串 $a 為十六進位如何轉換成二進位?

Update:

可以用 pack 與 unpack 方式來轉換嗎?

2 Answers

Rating
  • Anonymous
    1 decade ago
    Favorite Answer

    程式碼如下:

    ================================

    #/usr/bin/perl

    $a = "76543210";

    $d = $a;

    $o = oct($a);

    $h = hex($a);

    printf "$a (8 進位) = %b (2 進位)\n", $o;

    printf "$a (10 進位) = %b (2 進位)\n", $d;

    printf "$a (16 進位) = %b (2 進位)\n", $h;

    執行結果如下:

    ================================

    76543210 (8 進位) = 111110101100011010001000 (2 進位)

    76543210 (10 進位) = 100100011111111010011101010 (2 進位)

    76543210 (16 進位) = 1110110010101000011001000010000 (2 進位)

    2007-08-15 17:11:33 補充:

    pack, unpack並沒有辦法達成你要的目的

    請參考 http://perldoc.perl.org/functions/pack.html

    2007-08-15 18:03:55 補充:

    sub dec2bin {

    my $b = unpack("B*", pack("N", shift));

    $b =~ s/^0+//;

    return $b;

    }

    sub hex2bin {

    my $b = unpack("B*", pack("H8", substr("0" x 8 . shift, -8)));

    $b =~ s/^0+//;

    return $b;

    }

    $a = "76543210";

    printf "$a (10 進位) = %s (2 進位)\n", dec2bin($a);

    printf "$a (16 進位) = %s (2 進位)\n", hex2bin($a);

    2007-08-15 18:04:21 補充:

    因為 pack, unpack 沒有 8 進位的編碼

    所以只能達到部份你要的目的

    執行結果如下:

    =====================

    76543210 (10 進位) = 100100011111111010011101010 (2 進位)

    76543210 (16 進位) = 1110110010101000011001000010000 (2 進位)

    2007-08-15 19:56:31 補充:

    終於想到方法了,8 進位轉 2 進位,

    不能直接,只好間接轉

    sub oct2bin {

    my $b = unpack("B*", pack("H*", substr("0" x 8 . shift, -8)));

    $b =~ s/0([01]{3})/$1/g;

    $b =~ s/^0+//;

    return $b;

    }

    $a = "76543210";

    printf "$a (8 進位) = %s (2 進位)\n", oct2bin($a);

    執行結果:

    76543210 (8 進位) = 111110101100011010001000 (2 進位)

    2007-08-15 20:10:58 補充:

    完整程式請到這下載,三十天後自動會移除:

    http://w14.easy-share.com/3309111.html

    • Commenter avatarLogin to reply the answers
  • 1 decade ago

    一般而言 有人會先把八進位和十六進位先換算成十進位

    再從十進位換算成二進位,但是就八和十六來說 比十進制快多了

    在二十多年前學二進位時 有正規的算法是用二的次方來換算

    但我們都會用偷吃步 不用除法 直接用減法....

    先以十進位換二進位為例

    假設有個十進位的是210(如果用76543210怕二千字不夠寫@@)

    我們都己經很熟二的次方從0開始分別是

    0 1

    1 2

    2 4

    3 8

    4 16

    5 32

    6 64

    7 128

    8 256

    9 512

    ......

    所以像210要換算就先找比210小然後最大的數字 就是128

    所以 第八位數就是1 1xxxxxxx 210-128= 82

    128下一個就是 64 而82比64大

    所以第七位也是 1 11xxxxxx 82-64= 18

    64下一個是 32 但18比16小

    所以 第六位是 0 110xxxx

    32下一個就是 16 而18比16大

    所以第五位是 1 1101xxxx 18-16 = 2

    依此類推 最後留下來的2剛好是第二位數

    所210的二進位就是 11010010

    如果是要八換算二 就十分容易 只要先作出對照表

    一個八進位數直接對應三位數的二進制

    7 > 111

    6 > 110

    5 > 101

    4 > 100

    3 > 011

    2 > 010

    1 > 001

    0 > 000

    所以 76543210 就會變成 111 110 101 100 011 010 001 000

    空格是讓您容易閱讀

    同理可證

    十六位進位換二進位 就是一個十位進位對應四位二進制

    (對照表省略8-F,因為題目中沒有 ^^)

    7 > 0111

    6 > 0110

    5 > 0101

    4 > 0100

    3 > 0011

    2 > 0010

    1 > 0001

    0 > 0000

    所以二進位就變成 0111 0110 0101 0100 0011 0010 0001 0000

    完全不用計算 只有十進制最麻煩 ^_^

    但如果您提到字串 那就表示這不是個數值

    如果是程式的話 就要看不同情況來決定是不是要轉換成數值

    八和十六進制 只要建立字串對照表 逐字對應就可以了

    但十進制換二進制 就需要把整個字串換成數值 再用迴圈先找出二的次方中,那個次方(例如十次方是1024)剛好是比您的題目還小而且是最接近的,那就是最高的次方了,然後再遞減二的次方數逐一核對,像第一段的方式逐次先核對是否大於該次方的數字,如果大就表示該次方為1,然後減少該次方的數值,如果小就直接填該位數為0,再向低一次方的數字核對 直到0次方

    如果不是寫程式就直接看我前面的回答就好了 ^^

    Source(s): 二十年前學的數位電子學...
    • Commenter avatarLogin to reply the answers
Still have questions? Get your answers by asking now.