1

我将编辑问题。

我不应该在 L 和 R 中得到负数。但最终的答案对他们来说都是否定的。

这里

    long sum = 0L;
    long delta = 0x9e3779b9L;
    long L=0x01234567;
    long R=0x89ABCDEF;
    long K0 = 0xA56BABCDL;
    long K1 = 0x00000000L;
    long K2 = 0xFFFFFFFFL;
    long K3 = 0xABCDEF01L;

for (int i = 0; i < 32; i++) {
    sum = sum + delta;
    L = L + (((R << 4) + K0) ^ (R + sum) ^ ((R >> 5) + K1));
    R = R + (((L << 4) + K2) ^ (L + sum) ^ ((L >> 5) + K3));
    System.out.println(L + "   " + R);
}

有什么方法可以在 java 中使用 Hex 数据类型,让我的生活更轻松????是否有任何 Hex API 可以轻松支持移位操作和 XOR 操作。这不应该这么难。

4

3 回答 3

1

L在此处附加

long delta = 0x9e3779b9L; // note final L

使其成为类型的整数文字long如果没有L(or l),则会采用溢出为负值int的文字0x9e3779b9值,然后将该值扩大为 along

于 2013-09-16T01:10:53.640 回答
0

如果您需要通过左移来避免溢出,您希望使用BigInteger而不是 long 来存储您的号码。BigInteger 具有支持的方法or,以及左移和右移操作,并且由于 BigInteger 具有任意精度,因此左移不会溢出或切换数字的符号。

于 2013-09-16T01:54:48.557 回答
0

使用无符号右移运算符>>>代替正常的右移运算符>>。因此,符号位不会被保留,而是也会被移位。这使您可以将 Java 整数类型视为无符号整数。

于 2013-09-16T01:55:16.930 回答