2013-05-09 30 views
1

給定一個整數,我想在perl中逐位打印。例如,給定數字9,我想獲得如何在perl中進行按位運算以獲得兩個1之間最長0的序列的計數

1 
0 
0 
1 

我如何實現這一點。基本上我想要做的是獲得兩個1之間最長的0的數量。意思是如果一個數字的位數表示是這樣的 1000001001,我想這個Perl函數返回5.

我想知道最好的方式來編寫perl的這個最好的方法。對Perl完全陌生。

+0

什麼'1001000'? 2或3? – ikegami 2013-05-09 23:02:46

回答

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; 
    } 
} 
相關問題