【发布时间】:2018-10-23 12:05:01
【问题描述】:
我正在执行 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
为什么?
代码:
方法:long[] generateRoundKeys(long input)
【问题讨论】:
-
您声称编写的是 C#,但该链接指向一个带有“java”扩展名的文件。无论如何,该链接放错了位置,您应该将代码(简化为minimal reproducible example)放入问题中。
-
为什么要在 C# 中重新实现 DES 而不是使用 .NET 中的现有类?
-
有任何理由使用 DES 吗?鉴于它多年来一直被认为是不安全的......
-
末尾的:L表示数字32位数字存储在64位运算符中。小心符号扩展。
-
@CamiloTerevinto 我必须将其作为功课实施
标签: c# binary bit-manipulation