如何减少Perl中十六进制数的位大小

时间:2015-03-26 13:15:02

标签: perl

这是64 bit size of [63:0]十六进制数

0B08000000F41011

我希望在perl中将上述变量缩减为56 bit size of [55:0],而不会破坏原始的十六进制数据。有些人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

由于一个简单的原因,这是不可能的:

64位意味着有18,446,744,073,709,551,616个可能的州。

56bit意味着有72,057,594,037,927,936个可能的州。

您提供的数字超过56位,因此会导致溢出/切断等。

highest number for 64 bit
0xFFFFFFFFFFFFFFFF = 18,446,744,073,709,551,615 

highest number for 56 bit
0xFFFFFFFFFFFFFF   =     72,057,594,037,927,935

your number
0xB08000000F41011 =     794,885,334,246,887,441

答案 1 :(得分:2)

如果由于某种原因,这个64位值的高32位的最低有效8位始终应该为零,那么您可以轻松地执行此操作:

#!/usr/bin/env perl;

use strict;
use warnings;

use bigint; # for portability

my $x = hex '0B08000000F41011';
my $lo = $x & 0xffffffff;
my $hi = $x >> 40;
my $y = ($hi << 32) | $lo;

printf "%16X\n", $_ for $x, $hi, $lo, $y;

返回$x给定$y作为练习。

输出:

 B08000000F41011
           B0800
          F41011
   B080000F41011