Other people have shown you how to pack it. If you have irregular bit margins (shifts of 31, 32, 33), you might want to do the shifts using big integers:
#!/usr/bin/perl
use warnings;
use strict;
use Math::BigInt;
my $num = Math::BigInt->new('0x01');
my $mask1 = Math::BigInt->new('0x0FFFFFFFF')->blsft(32);
my $mask2 = Math::BigInt->new('0x0FFFFFFFF');
print "Number : ", $num->as_hex(), "\n";
$num->blsft(32);
print "Num shifted : ", $num->as_hex(), "\n";
#
# Split result into something that can be packed.
#
my $highorder = $num->copy()->band($mask1)->brsft(32);
my $loworder = $num->copy()->band($mask2);
print "High bits : ", $highorder->numify(), "\n";
print "Low bits : ", $loworder->numify(), "\n";
And the output is:
C:\Code>perl bigint_shift.pl
Number : 0x1
Num shifted : 0x100000000
High bits : 1
Low bits : 0
|