2013-05-09 1 views
1

정수가 주어진다면 perl에서 비트 단위로 인쇄하고 싶습니다. 예를 들어 숫자 9가 주어진다면Perl에서 bitwise 연산을 수행하여 두 개의 1 사이의 가장 긴 시퀀스의 수를 얻으십시오.

1 
0 
0 
1 

어떻게해야합니까? 본질적으로 내가하려고하는 것은 2 개의 1 사이에서 가장 긴 0의 수를 얻는 것입니다. 숫자의 비트 표현이 1000001001이면이 perl 함수가 5를 반환하는 것을 의미합니다.

나는 perl에서 이것을 코딩하는 가장 좋은 방법을 알고 싶습니다. Perl에 완전히 익숙하지 않습니다. 선행 0으로

+0

무엇 1001000''는 어떻습니까? 2 또는 3? – ikegami

답변

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에 의해 주어진 크기 (바이트)의 정수로 작동합니다. 당신이 문자열로두면

, 당신은 제로의 시퀀스를 추출하는 정규식 엔진을 활용할 수 있습니다.

C에서
use List::Util qw(max); 
my $bin = sprintf '%b', $num; 
my $longest = (max map length, $bin =~ /1(0+)(?=1)/g) || 0; 

, 당신은 다음과 같은 일을 할 수도 있지만, 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; 
    } 
}