Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125176
  • 博文数量: 19
  • 博客积分: 810
  • 博客等级: 准尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-14 23:34
文章分类

全部博文(19)

文章存档

2010年(2)

2009年(12)

2008年(5)

我的朋友

分类:

2009-04-05 22:58:32

文章出处:http://www.perl.it/documenti/faq/view.html?pag=4&faq=5&lng=en

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.



阅读(5398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~