Двоичная операция долго против INT - PullRequest
0 голосов
/ 13 мая 2018

Я занимаюсь реализацией DES и обнаружил проблему с бинарными операциями.

Я не могу понять, почему существует 32-битная маска (0xFFFFFFFFL) и почему после удаления она дает другое значение.

int leftHalf = (int)(input >> 28); 
int rightHalf = (int)(input & 0x0FFFFFFF);

long connectedHalves = ((leftHalf & 0xFFFFFFFFL) << 28) | (rightHalf & 0xFFFFFFFFL);
long notMasked = (leftHalf << 28) | rightHalf;

Например:

int leftHalf = 1048560
int rightHalf = 109436546

leftHalfBinary =              11111111111111110000
rightHalfBinary =      110100001011101111010000010

leftHalfMasked =  00000000000011111111111111110000
rightHalfMasked = 00000110100001011101111010000010

LeftHalfShifted =                   11111111111111110000 0000000000000000000000000000
LeftHalfMaskedShifted = 00000000000011111111111111110000 0000000000000000000000000000

Похоже, что дает тот же результат, но для этого примера:

connectedHalves = 281470791179906
notMasked = 109436546

Почему?

Код:

https://github.com/poltak/DataEncryptionStandard/blob/master/src/jpsam3hklam9/des/RoundKeyGenerator.java

метод: long [] generateRoundKeys (длинный ввод)

1 Ответ

0 голосов
/ 13 мая 2018

Если это int, он переполняется с << 28. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...