如何在Perl中减少十六进制数的位大小
这是[63:0]的如何在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
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