sub testbit #($bit_no, $flag)
  # testet Bit Nummer $bit_no in $flag
  {
  my ($bit_no, $flag) = @_;
  return ($flag & (1 << $bit_no)) ? 1 : 0;
  }

sub setbit #($bit_no, $flag} 
  # setzt Bit Nummer $bit_no in $flag auf 1
  {
  my ($bit_no, $flag) = @_;
  $_[1] = (1 << $bit_no) | $flag;
  }

sub clearbit #($bit_no, $flag) 
  # setzt Bit Nummer $bit_no in $flag auf 0
  {
  my ($bit_no, $flag) = @_;
  $_[1] = $flag & ~(1 << $bit_no);
  }

sub xorbit #($bit_no, $flag) 
  # invertiert Bit Nummer $bit_no in $flag
  {
  my ($bit_no, $flag) = @_;
  $_[1] = $flag ^ (1 << $bit_no);
  }

sub bitcount
  # zählt die 1-Bits in $flag
  {
  my $b = 0;
  my $flag = shift; 
  while ($flag != 0) 
    {
    $b++ if ($flag & 1);
    $flag = $flag >> 1;
    }
  return ($b);
  }


my ($i, $j, $k);

$j = 201;  # 11001001
for $i (0..7)
  { 
  $k = testbit($i,$j);
  printf ("testbit $i: %b\n", $k); 
  }
print "\n";
  
$k = bitcount($j);
print "$k 1-Bits in $j \n\n";
  
for $i (0..7)
  { 
  $j = 0; 
  setbit($i,$j);
  printf ("setbit $i:   %08b\n", $j); 
  }
print "\n";

for $i (0..7)
  { 
  $j = 255;   # 11111111
  clearbit($i,$j);
  printf ("clearbit $i: %08b\n", $j); 
  }
print "\n";

$j = 255;   # 11111111
xorbit(5,$j);
printf ("xorbit 5:   %08b\n", $j); 
xorbit(5,$j);
printf ("xorbit 5:   %08b\n", $j); 
