1#/usr/local/bin/perl 2 3sub lab_shift 4 { 5 local(*a,$n)=@_; 6 local(@r,$i,$j,$k,$d,@z); 7 8 @r=&shift(*a,$n); 9 foreach $i (0 .. 31) 10 { 11 @z=split(/\^/,$r[$i]); 12 for ($j=0; $j <= $#z; $j++) 13 { 14 ($d)=($z[$j] =~ /^(..)/); 15 ($k)=($z[$j] =~ /\[(.*)\]$/); 16 $k.=",$n" if ($k ne ""); 17 $k="$n" if ($k eq ""); 18 $d="$d[$k]"; 19 $z[$j]=$d; 20 } 21 $r[$i]=join('^',@z); 22 } 23 return(@r); 24 } 25 26sub shift 27 { 28 local(*a,$n)=@_; 29 local(@f); 30 31 if ($n > 0) 32 { 33 @f=&shiftl(*a,$n); 34 } 35 else 36 { 37 @f=&shiftr(*a,-$n); 38 } 39 return(@f); 40 } 41 42sub rotate 43 { 44 local(*a,$n)=@_; 45 local(@f); 46 47 if ($n > 0) 48 { @f=&rotatel(*a,$n); } 49 else 50 { @f=&rotater(*a,-$n); } 51 return(@f); 52 } 53 54sub rotater 55 { 56 local(*a,$n)=@_; 57 local(@f,@g); 58 59 @f=&shiftr(*a,$n); 60 @g=&shiftl(*a,32-$n); 61 $#f=31; 62 $#g=31; 63 return(&or(*f,*g)); 64 } 65 66sub rotatel 67 { 68 local(*a,$n)=@_; 69 local(@f,@g); 70 71 @f=&shiftl(*a,$n); 72 @g=&shiftr(*a,32-$n); 73 $#f=31; 74 $#g=31; 75 return(&or(*f,*g)); 76 } 77 78sub shiftr 79 { 80 local(*a,$n)=@_; 81 local(@r,$i); 82 83 $#r=31; 84 foreach $i (0 .. 31) 85 { 86 if (($i+$n) > 31) 87 { 88 $r[$i]="--"; 89 } 90 else 91 { 92 $r[$i]=$a[$i+$n]; 93 } 94 } 95 return(@r); 96 } 97 98sub shiftl 99 { 100 local(*a,$n)=@_; 101 local(@r,$i); 102 103 $#r=31; 104 foreach $i (0 .. 31) 105 { 106 if ($i < $n) 107 { 108 $r[$i]="--"; 109 } 110 else 111 { 112 $r[$i]=$a[$i-$n]; 113 } 114 } 115 return(@r); 116 } 117 118sub printit 119 { 120 local(@a)=@_; 121 local($i); 122 123 foreach $i (0 .. 31) 124 { 125 printf "%2s ",$a[$i]; 126 print "\n" if (($i%8) == 7); 127 } 128 print "\n"; 129 } 130 131sub xor 132 { 133 local(*a,*b)=@_; 134 local(@r,$i); 135 136 $#r=31; 137 foreach $i (0 .. 31) 138 { 139 $r[$i]=&compress($a[$i].'^'.$b[$i]); 140# $r[$i]=$a[$i]."^".$b[$i]; 141 } 142 return(@r); 143 } 144 145sub and 146 { 147 local(*a,$m)=@_; 148 local(@r,$i); 149 150 $#r=31; 151 foreach $i (0 .. 31) 152 { 153 $r[$i]=(($m & (1<<$i))?($a[$i]):('--')); 154 } 155 return(@r); 156 } 157 158sub or 159 { 160 local(*a,*b)=@_; 161 local(@r,$i); 162 163 $#r=31; 164 foreach $i (0 .. 31) 165 { 166 $r[$i]='--' if (($a[$i] eq '--') && ($b[$i] eq '--')); 167 $r[$i]=$a[$i] if (($a[$i] ne '--') && ($b[$i] eq '--')); 168 $r[$i]=$b[$i] if (($a[$i] eq '--') && ($b[$i] ne '--')); 169 $r[$i]='++' if (($a[$i] ne '--') && ($b[$i] ne '--')); 170 } 171 return(@r); 172 } 173 174sub compress 175 { 176 local($s)=@_; 177 local($_,$i,@a,%a,$r); 178 179 $s =~ s/\^\^/\^/g; 180 $s =~ s/^\^//; 181 $s =~ s/\^$//; 182 @a=split(/\^/,$s); 183 184 while ($#a >= 0) 185 { 186 $_=shift(@a); 187 next unless /\d/; 188 $a{$_}++; 189 } 190 foreach $i (sort keys %a) 191 { 192 next if ($a{$i}%2 == 0); 193 $r.="$i^"; 194 } 195 chop($r); 196 return($r); 197 } 1981; 199