#!/usr/bin/perl -w use strict; use constant WORDBYTES => 1; use constant WORDBITS => WORDBYTES*8; use constant WORDNYBBLES => WORDBYTES*2; use constant WORDMASK => (2**WORDBITS)-1; sub left_shift_hex_string { my($bits,$str,$add)=@_; my $val = hex(substr($str,0,WORDNYBBLES)); my $carryout = $val >> (2**WORDBYTES-$bits); if (length($str) > WORDNYBBLES) { my($carryin,$res)=left_shift_hex_string($bits,substr($str,WORDNYBBLES),$add); return ($carryout,sprintf "%x%s", ($val<<$bits | $carryin) & WORDMASK, $res); } else { warn "val=$val, bits=$bits, add=$add\n"; return($carryout,sprintf "%x", ($val<<$bits|$add)&WORDMASK); } } my($co,$val)=left_shift_hex_string(1,"00ffffff",0); print "val=$val\n";