我将编辑问题。
我不应该在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操作。这应该不是那么难。
答案 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整数类型视为无符号整数。