#!/usr/local/bin/perl | |
sub lab_shift | |
{ | |
local(*a,$n)=@_; | |
local(@r,$i,$j,$k,$d,@z); | |
@r=&shift(*a,$n); | |
foreach $i (0 .. 31) | |
{ | |
@z=split(/\^/,$r[$i]); | |
for ($j=0; $j <= $#z; $j++) | |
{ | |
($d)=($z[$j] =~ /^(..)/); | |
($k)=($z[$j] =~ /\[(.*)\]$/); | |
$k.=",$n" if ($k ne ""); | |
$k="$n" if ($k eq ""); | |
$d="$d[$k]"; | |
$z[$j]=$d; | |
} | |
$r[$i]=join('^',@z); | |
} | |
return(@r); | |
} | |
sub shift | |
{ | |
local(*a,$n)=@_; | |
local(@f); | |
if ($n > 0) | |
{ | |
@f=&shiftl(*a,$n); | |
} | |
else | |
{ | |
@f=&shiftr(*a,-$n); | |
} | |
return(@f); | |
} | |
sub rotate | |
{ | |
local(*a,$n)=@_; | |
local(@f); | |
if ($n > 0) | |
{ @f=&rotatel(*a,$n); } | |
else | |
{ @f=&rotater(*a,-$n); } | |
return(@f); | |
} | |
sub rotater | |
{ | |
local(*a,$n)=@_; | |
local(@f,@g); | |
@f=&shiftr(*a,$n); | |
@g=&shiftl(*a,32-$n); | |
$#f=31; | |
$#g=31; | |
return(&or(*f,*g)); | |
} | |
sub rotatel | |
{ | |
local(*a,$n)=@_; | |
local(@f,@g); | |
@f=&shiftl(*a,$n); | |
@g=&shiftr(*a,32-$n); | |
$#f=31; | |
$#g=31; | |
return(&or(*f,*g)); | |
} | |
sub shiftr | |
{ | |
local(*a,$n)=@_; | |
local(@r,$i); | |
$#r=31; | |
foreach $i (0 .. 31) | |
{ | |
if (($i+$n) > 31) | |
{ | |
$r[$i]="--"; | |
} | |
else | |
{ | |
$r[$i]=$a[$i+$n]; | |
} | |
} | |
return(@r); | |
} | |
sub shiftl | |
{ | |
local(*a,$n)=@_; | |
local(@r,$i); | |
$#r=31; | |
foreach $i (0 .. 31) | |
{ | |
if ($i < $n) | |
{ | |
$r[$i]="--"; | |
} | |
else | |
{ | |
$r[$i]=$a[$i-$n]; | |
} | |
} | |
return(@r); | |
} | |
sub printit | |
{ | |
local(@a)=@_; | |
local($i); | |
foreach $i (0 .. 31) | |
{ | |
printf "%2s ",$a[$i]; | |
print "\n" if (($i%8) == 7); | |
} | |
print "\n"; | |
} | |
sub xor | |
{ | |
local(*a,*b)=@_; | |
local(@r,$i); | |
$#r=31; | |
foreach $i (0 .. 31) | |
{ | |
$r[$i]=&compress($a[$i].'^'.$b[$i]); | |
# $r[$i]=$a[$i]."^".$b[$i]; | |
} | |
return(@r); | |
} | |
sub and | |
{ | |
local(*a,$m)=@_; | |
local(@r,$i); | |
$#r=31; | |
foreach $i (0 .. 31) | |
{ | |
$r[$i]=(($m & (1<<$i))?($a[$i]):('--')); | |
} | |
return(@r); | |
} | |
sub or | |
{ | |
local(*a,*b)=@_; | |
local(@r,$i); | |
$#r=31; | |
foreach $i (0 .. 31) | |
{ | |
$r[$i]='--' if (($a[$i] eq '--') && ($b[$i] eq '--')); | |
$r[$i]=$a[$i] if (($a[$i] ne '--') && ($b[$i] eq '--')); | |
$r[$i]=$b[$i] if (($a[$i] eq '--') && ($b[$i] ne '--')); | |
$r[$i]='++' if (($a[$i] ne '--') && ($b[$i] ne '--')); | |
} | |
return(@r); | |
} | |
sub compress | |
{ | |
local($s)=@_; | |
local($_,$i,@a,%a,$r); | |
$s =~ s/\^\^/\^/g; | |
$s =~ s/^\^//; | |
$s =~ s/\^$//; | |
@a=split(/\^/,$s); | |
while ($#a >= 0) | |
{ | |
$_=shift(@a); | |
next unless /\d/; | |
$a{$_}++; | |
} | |
foreach $i (sort keys %a) | |
{ | |
next if ($a{$i}%2 == 0); | |
$r.="$i^"; | |
} | |
chop($r); | |
return($r); | |
} | |
1; |