这是64 bit size of [63:0]
十六进制数
0B08000000F41011
我希望在perl中将上述变量缩减为56 bit size of [55:0]
,而不会破坏原始的十六进制数据。有些人可以帮我解决这个问题吗?
答案 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