我正在做DES实现,我解决了二进制操作的问题。
我无法弄清楚为什么有 32 位掩码 (0xFFFFFFFFFL( 以及为什么删除它后它会给出其他值。
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[] 生成回键(long input(
如果是 int,则溢出 <<28。