Monday, May 07, 2007
Perl 펄 비트연산] 특정 비트 개수 세기, 1인 비트, 0인 비트 수; Count Bits Function
데이터를 이진수로 표현하면 "0인 비트"와 "1인 비트" 두 가지가 있습니다. 아래의 countBits() 함수/서브루틴에, 정수를 넣어주면, 그 숫자에서 1인 비트 즉 켜져 있는 비트의 개수만을 구합니다. 0인 비트의 숫자를 구하려면 그 자료형의 총 비트수에서 1인 비트의 수를 빼주면 됩니다.
다음 예제에서는 숫자를 "부호 없는 16비트 정수형" 즉, "unsigned short" 으로 간주했습니다.
파일명: example.pl
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
실행 결과 화면:
▶▶ Perl 펄 비트 연산] 특정 비트 읽기, 1비트씩 추출; Get a Bit, Read a Bit
▶▶ Perl 펄 비트연산] 특정 비트 쓰기, 1비트씩 저장 함수; Set a Bit, Save a Bit
▶▶ Perl 펄 비트연산] 특정 비트 반전, 1비트씩 역전 함수; Reverse a Bit Function
다음 예제에서는 숫자를 "부호 없는 16비트 정수형" 즉, "unsigned short" 으로 간주했습니다.
0, 1비트 숫자 구하기 함수 예제
파일명: example.pl
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
#!/usr/bin/perl
use strict; use warnings;
my ($num, $c);
$num = 0; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 1; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 0xff; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 0xffff; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 0b1010101010101010; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 0b0101010101010101; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 61547; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
sub countBits {
my $x = shift;
my $count = 0;
while ($x != 0) {
$x &= $x - 1;
$count++;
}
return $count;
}
use strict; use warnings;
my ($num, $c);
$num = 0; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 1; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 0xff; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 0xffff; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 0b1010101010101010; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 0b0101010101010101; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
$num = 61547; $c = countBits($num);
printf("%016b = %10u : [1s = %2d] [0s = %2d]\n", $num, $num, $c, 16 - $c);
sub countBits {
my $x = shift;
my $count = 0;
while ($x != 0) {
$x &= $x - 1;
$count++;
}
return $count;
}
실행 결과 화면:
D:\Z>example.pl
0000000000000000 = 0 : [1s = 0] [0s = 16]
0000000000000001 = 1 : [1s = 1] [0s = 15]
0000000011111111 = 255 : [1s = 8] [0s = 8]
1111111111111111 = 65535 : [1s = 16] [0s = 0]
1010101010101010 = 43690 : [1s = 8] [0s = 8]
0101010101010101 = 21845 : [1s = 8] [0s = 8]
1111000001101011 = 61547 : [1s = 9] [0s = 7]
D:\Z>
0000000000000000 = 0 : [1s = 0] [0s = 16]
0000000000000001 = 1 : [1s = 1] [0s = 15]
0000000011111111 = 255 : [1s = 8] [0s = 8]
1111111111111111 = 65535 : [1s = 16] [0s = 0]
1010101010101010 = 43690 : [1s = 8] [0s = 8]
0101010101010101 = 21845 : [1s = 8] [0s = 8]
1111000001101011 = 61547 : [1s = 9] [0s = 7]
D:\Z>
▶▶ Perl 펄 비트 연산] 특정 비트 읽기, 1비트씩 추출; Get a Bit, Read a Bit
▶▶ Perl 펄 비트연산] 특정 비트 쓰기, 1비트씩 저장 함수; Set a Bit, Save a Bit
▶▶ Perl 펄 비트연산] 특정 비트 반전, 1비트씩 역전 함수; Reverse a Bit Function
tag: perl
Perl | 펄
<< Home