【问题标题】:Binary operation long vs int二进制操作 long vs int
【发布时间】: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

为什么?

代码:

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

方法:long[] generateRoundKeys(long input)

【问题讨论】:

  • 您声称编写的是 C#,但该链接指向一个带有“java”扩展名的文件。无论如何,该链接放错了位置,您应该将代码(简化为minimal reproducible example)放入问题中。
  • 为什么要在 C# 中重新实现 DES 而不是使用 .NET 中的现有类?
  • 有任何理由使用 DES 吗?鉴于它多年来一直被认为是不安全的......
  • 末尾的:L表示数字32位数字存储在64位运算符中。小心符号扩展。
  • @CamiloTerevinto 我必须将其作为功课实施

标签: c# binary bit-manipulation


【解决方案1】:

如果是 int 则溢出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多