1

给定一个整数,我想在 perl 中逐位打印。例如给定一个数字 9,我想得到

1
0
0
1

我如何做到这一点。基本上我想要做的是,获得两个 1 之间最长的 0 的数量。这意味着如果一个数字的按位表示是 1000001001,我希望这个 perl 函数返回 5。

我想知道用 perl 编写代码的最佳方法是什么。我对 perl 完全陌生。

4

1 回答 1

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;
   }
}
于 2013-05-09T22:52:02.167 回答