Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中减少十六进制数的位大小_Perl - Fatal编程技术网

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

如何在Perl中减少十六进制数的位大小,perl,Perl,这是[63:0]的64位大小 0B08000000F41011 我希望在perl中将上述变量缩减为[55:0]的56位大小,而不会损坏原始十六进制数据。有人能帮我解决这个问题吗?这不可能,原因很简单: 64位表示有18446744073709551616个可能的状态 56位表示有72057594037927936个可能的状态 您提供的数字超过56位,因此会导致溢出/截止或其他情况 highest number for 64 bit 0xFFFFFFFFFFFFFFFF = 18,446,744

这是[63:0]的
64位大小

0B08000000F41011

我希望在perl中将上述变量缩减为[55:0]
的56位大小,而不会损坏原始十六进制数据。有人能帮我解决这个问题吗?

这不可能,原因很简单:

64位表示有18446744073709551616个可能的状态

56位表示有72057594037927936个可能的状态

您提供的数字超过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

如果出于某种原因,此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;

如果OP的可能输入少于2^56,则即使数字大于2^56,也可以将数字编码为2^56状态。(例如,2^100可以准确地存储在64位浮点数中。)换句话说,OP没有提供足够的信息来确定他想做的事情是否可行。@ikegami你是对的。当使用更复杂的位格式/布局(例如固定比特大小的指数和偏移量/重要值)时,可能是可能的,但是必须知道所需的精度来考虑这样的选项。另一种可能的方法是将64位输入拆分为两个56位数字(低字节/高字节)。正如你已经说过的,没有OP提供的用例/附加信息,我们无法继续。 B08000000F41011 B0800 F41011 B080000F41011