给定一个整数,我想在perl中逐位打印。例如给出9号,我想得到
1
0
0
1
我如何实现这一目标。基本上我要做的是,获得两个1之间的最长0的数量。意味着数字的按位表示是否为此 1000001001,我希望这个perl函数返回5。
我想知道在perl中编写代码的最佳方法是什么。对perl来说是全新的。
答案 0 :(得分:4)
带前导零:
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;
}
}