シフト演算
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
で、論理右シフトになっている模様。