Java十六进制数中的问题

时间:2013-09-16 01:08:21

标签: java hex sign

我将编辑问题。

我不应该在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操作。这应该不是那么难。

3 个答案:

答案 0 :(得分:1)

在此处附加L

long delta = 0x9e3779b9L; // note final L

如果它变为integer literal of type long.而没有L(或l),那么文字int的{​​{1}}值就会变为负数值,然后该值为widened to a long

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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