Изменение заключается в добавлении & 0xfffffff0
и & 0x7ffffff
к циклу for при вычислении L и R. Они известны как битовые маски - маскирование целого числа с помощью 0x7ffffff
гарантирует, что 32-битное количество не может бытьзнаковый (самый значимый бит равен 0), в то время как маскирование с помощью 0xfffffff0
гарантирует, что младшие четыре бита равны нулю.
Другое незначительное изменение по сравнению с тем, что было сделано в OP, было использование >>
вместо >>>
, но это не влияет на результат.
public static void main(String[] args)
{
int L = 0x12345678;
int R = 0x9abcdef;
int delta = 0x9e3779b9;
int sum = 0x0;
int[] key = {0xa56babcd,0xf000ffff,0xffffffff,0xabcdef01};
//Encrypt
for(int i = 0; i < 32; i++)
{
sum += delta;
L += (R << 4 & 0xfffffff0) + key[0] ^ R + sum ^ (R >> 5 & 0x7ffffff) + key[1];
R += (L << 4 & 0xfffffff0) + key[2] ^ L + sum ^ (L >> 5 & 0x7ffffff) + key[3];
}
System.out.println(String.format("0x%x", L) + " " + String.format("%x", R));
}