如何在perl中进行按位运算以获得两个1之间最长0的序列计数

时间:2013-05-09 22:44:57

标签: perl bit

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

1
0
0
1

我如何实现这一目标。基本上我要做的是,获得两个1之间的最长0的数量。意味着数字的按位表示是否为此 1000001001,我希望这个perl函数返回5。

我想知道在perl中编写代码的最佳方法是什么。对perl来说是全新的。

1 个答案:

答案 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;
   }
}