#!/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;