Delphi Tips 
-----------------------------

0225  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/08/28 西坂良幸 rev 1.4
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/05 藤中理香 編集
数値の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;

参照: [Delphi-ML:32720] <計算> <PASCAL>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp