Как выполнить сложение по модулю 2 в степень 64 - PullRequest
3 голосов
/ 07 июля 2019

Я хочу выполнить сложение по модулю 2 в степени 64 между p1 и p2, используя MATLAB.И p1, и p2 относятся к типу uint64.Правильный ли следующий код?

c1 = p1 + p2;
if (c1> 2^64)
    c1 = c1 - 2^64;
end

1 Ответ

2 голосов
/ 07 июля 2019

Максимальное значение переменных типа 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;
else
    c1  = p1 + p2;
end

Этот код будет выполнять добавление по модулю 2 к степени 64 между p1 и p2

...