表題のような関数はありますでしょうか。
1桁目だけを合計したいのですが。
2桁未満の数字は1桁なのでは?
たとえば
a := 12345;
の場合、5 の部分を数値としてとりだすには10で割ったあまり
b := (a mod 10);
とすると b は 5 になります。
やはり,割らないとだめですよね
> やはり,割らないとだめですよね
わり算だと何か不都合があるのですか?
function hitoketa(value:integer):integer;
begin
result := value mod 10;
end;
すみませんでした。
とにかく問題は解決しました。
ありがとうございました。
問題解決
十進の8桁までの整数のバイナリー表現を4ビットごとの十進数(BCD)表現に
変換する関数を見つけました。
ここの Tips21 です。
http://www.xploiter.com/programming/delphi/tips3.shtml
これを使うと一回の変換で、各桁の10進数が求められます。
function Base10(Base2:Integer) : Integer; assembler;
asm
cmp eax,100000000 // check upper limit
jb @1 // ok
mov eax,-1 // error flag
jmp @exit // exit with -1
@1:
push ebx // save registers
push esi
xor esi,esi // result = 0
mov ebx,10 // diveder base 10
mov ecx,8 // 8 nibbles (10^8-1)
@2:
mov edx,0 // clear remainder
div ebx // eax DIV 10, edx mod 10
add esi,edx // result = result + remainder[I]
ror esi,4 // shift nibble
loop @2 // loop for all 8 nibbles
mov eax,esi // function result
pop esi // restore registers
pop ebx
@exit:
end;
procedure TForm1.Button1Click(Sender: TObject);
var
value,i:integer;
begin
value := 12345678;
value := Base10(value);
for i := 1 to 8 do
Memo1.Lines.Add(IntToStr(value shr ((i-1)*4) and $F));
end;
Memo1 の結果
8
7
6
5
4
3
2
1
上のコードはアセンブラですが、10で割って商と余りを繰り返し使っていること
には変わりありませんね。最下位(1の位)だけでしたら mod 10 の方が何倍も
高速でしょう。
ツイート | ![]() |