有什么问题v:=v shl b
?我正在尝试计算mask = 2 n -1 like 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;
……但是,我不开心。