1
給定一個整數,我想在perl中逐位打印。例如,給定數字9,我想獲得如何在perl中進行按位運算以獲得兩個1之間最長0的序列的計數
1
0
0
1
我如何實現這一點。基本上我想要做的是獲得兩個1之間最長的0的數量。意思是如果一個數字的位數表示是這樣的 1000001001,我想這個Perl函數返回5.
我想知道最好的方式來編寫perl的這個最好的方法。對Perl完全陌生。
給定一個整數,我想在perl中逐位打印。例如,給定數字9,我想獲得如何在perl中進行按位運算以獲得兩個1之間最長0的序列的計數
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;
}
}
什麼'1001000'? 2或3? – ikegami 2013-05-09 23:02:46