#!/usr/bin/perl
use strict;
use warnings;
my @memory = (0, 0, 5, 59);
print "Original values:\n";
printf "% 3u : %08b\n", $_, $_ for @memory;
$memory[1] = $memory[1] << 7;
$memory[2] = $memory[2] << 14;
$memory[3] = $memory[3] << 21;
print "\nAfter shifting the values\n";
printf "% 10u : %032b\n", $_, $_ for @memory;
my $t = 0;
$t += $_ for @memory;
print "\nThe sum:\n";
printf "% 10u : %032b\n", $t, $t;
####
Original values:
0 : 00000000
0 : 00000000
5 : 00000101
59 : 00111011
After shifting the values
0 : 00000000000000000000000000000000
0 : 00000000000000000000000000000000
81920 : 00000000000000010100000000000000
123731968 : 00000111011000000000000000000000
The sum:
123813888 : 00000111011000010100000000000000
####
sub plonk {
my ($b0, $b1, $b2, $b3) = @_;
return $b0 & 0x7f
+ ($b1 & 0x7f) << 7
+ ($b2 & 0x7f) << 14
+ ($b3 & 0x7f) << 21;
}