给定一个整数,我想在 perl 中逐位打印。例如给定一个数字 9,我想得到
1
0
0
1
我如何做到这一点。基本上我想要做的是,获得两个 1 之间最长的 0 的数量。这意味着如果一个数字的按位表示是 1000001001,我希望这个 perl 函数返回 5。
我想知道用 perl 编写代码的最佳方法是什么。我对 perl 完全陌生。
带前导零:
my @bits = reverse unpack '(a)*', unpack 'B*', pack 'J>', $int;
没有:
my @bits = reverse unpack '(a)*', sprintf '%b', $int;
笔记:
reverse
用于将最低有效位放入$bits[0]
.unpack '(a)*'
用于将字符串拆分为单独的位。perl -V:ivsize
。如果将其保留为字符串,则可以利用正则表达式引擎提取零序列。
use List::Util qw( max );
my $bin = sprintf '%b', $num;
my $longest = ( max map length, $bin =~ /1(0+)(?=1)/g ) || 0;
在 C 中,您可能会执行以下操作,但在 Perl 中,它的效率可能低于早期的解决方案:
my $longest = 0;
if ($num) {
# Cast to unsigned so that >> inserts zeroes even for neg nums.
$num = ~~$num;
# Skip zeros not between 1s.
$num >>= 1 while !($num & 1);
while (1) {
# Skip 1s.
$num >>= 1 while $num & 1;
last if !$num;
# Count 0s.
my $len = 0; ++$len, $num >>= 1 while !($num & 1);
$longest = $len if $longest < $len;
}
}