数値の2進数への変換で効率的な方法
|
ML[Delphi-ML:32617]〜[Delphi-ML:32720]のスレッドにいろいろな変換関数例が示されています。
ベンチワークしたわけではありませんが、効率ということでは、中川さんのコードがお勧めでは?
「10進から2進数への変換に標準関数はありませんが、デルファイではTBitsという
似て非なるクラスがあります。(定義はclassesの中)
そこを見てみますと、インラインアセンブラが使われています。ということで、題材的に
インラインアセンブラが向いているのではないかと思い作ってみました。」[Delphi-ML:32720]中川
以下、中川さんの例示コードをIntToHex型パラメータの関数にしたものです。(4桁ごとのスペースはありません)
function IntToBin(Int: LongInt; Digits: Integer = 32): string;
// 変換の関数
procedure ToBin(Int: LongInt; x: pointer);
asm
push ebx; // ebxは使用不可なので保存
mov edx,x; // 文字列の先頭アドレス
mov eax,int; // 変換する整数
mov ecx,32; // 32回のループのセット
@MAWASU:
mov bl,'0'; // とりあえず文字「0」とする
sal eax,1; // 整数を左シフトして、1ビットを取り出す
jnc @TOBU; // ビットが0ならそのまま
inc bx; // ビットが1ならば文字を「1」にする
@TOBU:
mov [edx],bl; // 文字を書き込む
inc edx; // 文字列のポインタを進める。
loop @MAWASU; // これを繰り返す
mov bl,0; // 文字列の最後は空文字
mov [edx],bl; // 最後の空文字の書き込み
pop ebx; // ebxを呼び戻す
end;
var
Buff: array[0..63] of Char;
begin
if (Digits> 1) and (Digits <= 32) then
begin
ToBin(Int, @Buff);
result := StrPas(Buff + 32 - Digits);
exit;
end;
raise EConvertError.Create('第二パラメータが範囲外です。');
end;
// テスト
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := IntToBin(16,8);
Edit2.Text := IntToBin(-1);
Edit3.text := IntToBin(Integer($F0F0F0F0));
end;
|
|