シフト演算

perlでは算術右シフトはできないっぽい
printf("-2 >> 1 is %d\n", -2 >> 1);
  • 2 >> 1 is 2147483647

と表示される。

試しに、自作関数で2進数表記にしてみると

print &decimal2binary(-2), "\n";
print &decimal2binary(-2 >> 1), "\n";

sub decimal2binary {
  my $binary = "";
  my @splited = split(//, sprintf("%o", shift));
  foreach(@splited) {
    $binary .= &octal2binary($_);
  }

  $binary = substr($binary, -32) if (length($binary) > 32);
  return $binary;
}

sub octal2binary {
  my $result = "";
  my $num = shift;
  for (my $i = 1; $i <= 3; $i++) {
    if ($num%(2**$i)) {
      $result = 1 . $result;
      $num -= 2**($i-1);
    } else {
      $result = 0 . $result;
    }
  }
  return $result;
}
  • 2は

11111111111111111111111111111110

  • 2 >> 1は

01111111111111111111111111111111
で、論理右シフトになっている模様。