我想在 MATLAB 之间p1
和p2
使用 MATLAB 之间对 64 次幂执行加法模 2。p1
和都是p2
类型uint64
。下面的代码正确吗?
c1 = p1 + p2;
if (c1> 2^64)
c1 = c1 - 2^64;
end
我想在 MATLAB 之间p1
和p2
使用 MATLAB 之间对 64 次幂执行加法模 2。p1
和都是p2
类型uint64
。下面的代码正确吗?
c1 = p1 + p2;
if (c1> 2^64)
c1 = c1 - 2^64;
end
类型变量的最大值uint64
是2^64-1
(在 Matlab 中intmax('uint64')
),当您执行超过此值(溢出)的加法运算时,结果为2^64-1
,因此您的代码将无法工作。
例如:
p1 = uint64(2^64-1) - 5;
p2 = uint64(10);
c1 = p1 + p2;
结果c1
是:
>> c1 =
uint64
18446744073709551615
这是2^64-1
(而不是 2^64-1 + 5
)
结果c1-p1
是:
>> c1-p1
ans =
uint64
5
但应该是10
您可以在加法之前检查是否会有溢出,如果有,请计算余数:
intmaxDif = intmax('uint64') - p1;
if(p2 > intmaxDif)
c1 = p2 - intmaxDif - 1;
else
c1 = p1 + p2;
end
p1
此代码将在和之间执行 64 次幂的模 2p2
感谢Cris Luengo的更正。