You need an L
at the end of the first integer literal:
long a = 0x0000000080000001L ^ 0x4065DE839A6F89EEL;
Otherwise it is an int
literal, not a long
(the leading zeroes being ignored). The ^
operator then promotes the first operand value from 0x80000001 to a long
, but since the sign bit is set, the result of the promotion is 0xFFFFFFFF80000001L.