www.pudn.com > sslref30.zip > shifts.pl


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 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;