何が問題なのv:=v shl b
ですか? mask = 2 n -1 のように計算しようとしてmask:=1 shl n-1
いますが、整数変数 n=64 では失敗します。
program UInt64Test;
{$APPTYPE CONSOLE}
var
u,v,w:uint64;
const
a=64;
var
b:integer=a;
c:integer=a-1;
begin
u:=1; v:=1; w:=1;
u:=u shl a;
v:=v shl b;
w:=w shl 1 shl c;
writeln(u);
writeln(v);
writeln(w);
readln;
end.
出力:
0
1
0
v
私もゼロだと思っていました。
のように解決し2 shl (n-1)-1
ました。この場合、コンパイラはマシンを実行しますshl
(ない__llshl
):
function reciprocal(o:uint64;n:byte=64):uint64; // result * o = 1 (mod 2ⁿ)
var
b,m,t:uint64;
begin
result:=0;
t:=2 shl (n-1)-1;
m:=0; b:=1;
while b<>0 do begin
m:=m or b;
if ((o*result) and m)<>1 then result:=result or b;
b:=(b shl 1) and t;
end;
end;
……でも、うれしくない。