[Perl]1バイト(8bit)の10進数を2進数の文字列に変換するコード
Perlの関数を使用して、以下の手順で10進数を2進文字列に変換することができます。
- sprintf関数で10進数を16進文字列に変換
- pack関数で16進文字列をバイナリーにパック
- unpack関数で2進文字列に変換
例えば、文字列の先頭文字のASCIIコード値(10進数)を取得し、それを2進文字列に変換に変換する場合は、 次のようなコードになります。
#!/usr/bin/perl
use strict;
use warnings;
my $ascii = "ABC";
my $asciicode = ord $ascii; # 先頭文字のASCIIコード値を取得
my $str = _bitstr($asciicode, 8);
print "str = $str\n"; # for debug
exit;
# 10進数を2進文字列に変換する関数
sub _bitstr {
my ($code, $len) = @_;
my $hexcode = sprintf("%X", $code); # 16進に変換
my $bitstr = unpack("B".$len, pack("H2", $hexcode));
}
10進数を単に2進文字列に変換するだけならこれでも構わないのですが、ビット演算子を使ってビットのオン・オフを判定して、 2進文字列を作成していく方法もあります。以下のコードはその実装例です。
#!/usr/bin/perl
use strict;
use warnings;
my $ascii = "ABC";
my $asciicode = ord $ascii; # 先頭文字のASCIIコード値を取得
my $str = _bitstrR($asciicode, 8);
print "str = $str\n"; # for debug
exit;
# ビット演算で10進数を2進文字列に変換する関数
sub _bitstrR {
my ($code, $len) = @_;
my $bitstr = '';
for my $i (1 .. $len) {
$bitstr .= (0x80 & $code) ? '1' : '0'; # 0x80(2進数:10000000)でビット論理積をとる
$code <<= 1;
}
return $bitstr;
}
ここで問題になるのはどちらの方法が処理速度が優れているかということですが、以下のコードのプロファイルを取ると・・・
#!/usr/bin/perl
use strict;
use warnings;
my $ascii = "ABC";
my $asciicode = ord $ascii; # 先頭文字のASCIIコード値を取得
my $str = '';
for my $j (1 .. 10000) {
$str = _bitstr($asciicode, 8);
$str = _bitstrR($asciicode, 8);
}
print "str = $str\n"; # for debug
exit;
sub _bitstr {
my ($code, $len) = @_;
my $hexcode = sprintf("%X", $code); # 16進に変換
my $bitstr = unpack("B".$len, pack("H2", $hexcode));
}
sub _bitstrR {
my ($code, $len) = @_;
my $bitstr = '';
for my $i (1 .. $len) {
$bitstr .= (0x80 & $code) ? '1' : '0'; # 0x80(2進数:10000000)でビット論理積をとる
$code <<= 1;
}
return $bitstr;
}
C:\xampp\htdocs\sample>perl -d:Dprof bitstr3.pl
str = 01000001
C:\xampp\htdocs\sample>dprofpp
Total Elapsed Time = 0.018988 Seconds
User+System Time = 0.016988 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
223. 0.038 0.038 10000 0.0000 0.0000 main::_bitstr
47.0 0.008 0.008 10000 0.0000 0.0000 main::_bitstrR
0.00 - -0.000 1 - - strict::import
0.00 - -0.000 1 - - warnings::import
0.00 - -0.000 1 - - strict::bits
0.00 - -0.000 2 - - main::BEGIN
やはり、ビット演算で2進文字列を作成するほうが早いようです。
プログラミングPerl〈VOLUME1〉
オライリー・ジャパン 著者:ラリー ウォール,ジョン オーワント,トム クリスチャンセン
amazon.co.jpのカスタマーレビューを見る
powered by amalink
オープン | 0 point | Link (4) | Trackback (0) | Comment (0)
キーワード
[Perl]1バイト(8bit)の10進数を2進数の文字列に変換するコード 関連リンク
| [Perl]2次元配列のサンプルプログラム | |
| C言語やC++なら2次元配列といっても配列の階層を増やすだけなので、わりと簡単に理解できるのですが、Perlはそこでリファレンスという、いまいちわかりにくいものが出てくるのでちょっと面倒です。とはいっても、2次... | |
| [PHP]10進数を2進文字列に変換するコード | |
| PHPの場合は、ズバリ10進数を2進文字列に変換できるdecbin関数があるので、decbin関数を使用すればいいのですが、もちろん、Perlの場合と同様にビット演算で2進文字列に変換することもできます。以下は、そのサンプル... | |
| [Perl]UTF-8でエンコードされた文字列の文字数を取得するコード | |
| Perlのlength関数ではバイト単位となるので、UTF-8でエンコードされている場合、漢字、ひらがな、カタカナなどは1文字で3となってしまいます。ブログなどのアプリケーションのテキスト処理ではそれでは不都合な場合も... | |
| [Perl]UTF-8でエンコードされた文字列の部分文字列を取り出すコード | |
| Perlのsubstr関数ではバイト単位の操作になるので、漢字、ひらがな、カタカナなどの全角文字を文字数で指定して部分文字列を取り出すことができません。それでは不都合なことも多いので、半角英数も全角文字も1文字と... |
|
[Perl]1バイト(8bit)の10進数を2進数の文字列に変換するコード トラックバック
トラックバックURL :
[Perl]1バイト(8bit)の10進数を2進数の文字列に変換するコードへのコメント
アクセスランキング
今日のアクセスランキング TOP 10
- 完全無料のMT5用ナンピンEA「Nanpin K(ナンピンケイ) MT5」 使用制限無し (1 PV)
- 裁量トレードを半自動化する無料のMT5向け裁量トレード支援ツール(裁量補助EA)「PositionKeeper MT5」 #FX (1 PV)
- 中島美嘉(なかしまみか) (1 PV)
- 無料掲示板CGIのダウンロード (1 PV)
- a8.net(エーハチネット) (1 PV)
- 「Scalpin」スキャルピングとナンピンマーチンを組み合わせたスキャルピングツール(半手動半自動EA) (1 PV)
- SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (1 PV)
- HTML5 Rocks (1 PV)
今月のアクセスランキング TOP 10
- 2NN 2ちゃんねるニュース速報+ナビ (7 PV)
- 無料掲示板CGIのダウンロード (7 PV)
- 裁量トレードを半自動化する無料のMT5向け裁量トレード支援ツール(裁量補助EA)「PositionKeeper MT5」 #FX (5 PV)
- 自作のMT4向け無料EA(口座縛り無し、ブローカー縛り無し、使用期限無し)とゴゴジャン出品中の有料EAの一覧 #MT4 (4 PV)
- Google Finance(グーグルファイナンス)- リアルタイム株価情報、金融ニュース、日本株 (3 PV)
- SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (3 PV)
- IBM、開発者向けに無償版データベースソフト「IBM Db2 Developer Community Edition」を公開 #プログラミング (2 PV)
- Million Dollar(MT4)リアルフォワード(myfxbook) #Gold(XAUUSD) #ナンピンマーチン (2 PV)
- 完全無料のMT5用ナンピンEA「Nanpin K(ナンピンケイ) MT5」 使用制限無し (2 PV)
- 将棋倶楽部24がフィッシャールール(早指し3)導入 (2 PV)
アクセス統計
ディレクトリ
関連サイト
