分享

十进制与二、八、十六进制间的相与转化

 咖啡猫来啦 2015-03-09

indietro

[5] How do I convert between numeric representations/bases/radixes?

As always with Perl there is more than one way to do it. Below are a few examples of approaches to making common conversions between number representations. This is intended to be representational rather than exhaustive.

Some of the examples below use the Bit::Vector module from CPAN. The reason you might choose Bit::Vector over the perl built in functions is that it works with numbers of ANY size, that it is optimized for speed on some operations, and for at least some programmers the notation might be familiar.

  • How do I convert hexadecimal into decimal

    Using perl's built in conversion of 0x notation:

        $dec = 0xDEADBEEF;

    Using the hex function:

        $dec = hex("DEADBEEF");

    Using pack:

        $dec = unpack("N", pack("H8", substr("0" x 8 . "DEADBEEF", -8)));

    Using the CPAN module Bit::Vector:

        use Bit::Vector;
        $vec = Bit::Vector->new_Hex(32, "DEADBEEF");
        $dec = $vec->to_Dec();
  • How do I convert from decimal to hexadecimal

    Using sprintf:

        $hex = sprintf("%X", 3735928559); # upper case A-F
        $hex = sprintf("%x", 3735928559); # lower case a-f

    Using unpack:

        $hex = unpack("H*", pack("N", 3735928559));

    Using Bit::Vector:

        use Bit::Vector;
        $vec = Bit::Vector->new_Dec(32, -559038737);
        $hex = $vec->to_Hex();

    And Bit::Vector supports odd bit counts:

        use Bit::Vector;
        $vec = Bit::Vector->new_Dec(33, 3735928559);
        $vec->Resize(32); # suppress leading 0 if unwanted
        $hex = $vec->to_Hex();
  • How do I convert from octal to decimal

    Using Perl's built in conversion of numbers with leading zeros:

        $dec = 033653337357; # note the leading 0!

    Using the oct function:

        $dec = oct("33653337357");

    Using Bit::Vector:

        use Bit::Vector;
        $vec = Bit::Vector->new(32);
        $vec->Chunk_List_Store(3, split(//, reverse "33653337357"));
        $dec = $vec->to_Dec();
  • How do I convert from decimal to octal

    Using sprintf:

        $oct = sprintf("%o", 3735928559);

    Using Bit::Vector:

        use Bit::Vector;
        $vec = Bit::Vector->new_Dec(32, -559038737);
        $oct = reverse join('', $vec->Chunk_List_Read(3));
  • How do I convert from binary to decimal

    Perl 5.6 lets you write binary numbers directly with the 0b notation:

        $number = 0b10110110;

    Using oct:

        my $input = "10110110";
        $decimal = oct( "0b$input" );

    Using pack and ord:

        $decimal = ord(pack('B8', '10110110'));

    Using pack and unpack for larger strings:

        $int = unpack("N", pack("B32",
    	substr("0" x 32 . "11110101011011011111011101111", -32)));
        $dec = sprintf("%d", $int);
        # substr() is used to left pad a 32 character string with zeros.

    Using Bit::Vector:

        $vec = Bit::Vector->new_Bin(32, "11011110101011011011111011101111");
        $dec = $vec->to_Dec();
  • How do I convert from decimal to binary

    Using sprintf (perl 5.6+):

        $bin = sprintf("%b", 3735928559);

    Using unpack:

        $bin = unpack("B*", pack("N", 3735928559));

    Using Bit::Vector:

        use Bit::Vector;
        $vec = Bit::Vector->new_Dec(32, -559038737);
        $bin = $vec->to_Bin();

    The remaining transformations (e.g. hex -> oct, bin -> hex, etc.) are left as an exercise to the inclined reader.

vedi in italiano

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen and Nathan Torkington. All rights reserved.

This documentation is free; you can redistribute it and/or modify it under the same terms as Perl itself.

Irrespective of its distribution, all code examples here are in the public domain. You are permitted and encouraged to use this code and any derivatives thereof in your own programs for fun or for profit as you see fit. A simple comment in the code giving credit to the FAQ would be courteous but is not required.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多