i checking out sweet little code swap 2 variables using xor function. used javascript this.
let x , y 2 variables , let x = 4, y = 6.
x = x ^ y; y = y ^ x; x = x ^ y;
it swaps variables nicely. notice i'm keeping x , y different prevent aliasing can occur due first xor.
then, observing statement, wrote: x = x ^ (y = y ^ (x = x ^ y )); swaps variable y correctly makes x 0.
also, x ^= y ^= x ^= y; seems equivalent expression yields same incorrect result in second case.
however, these statements run equivalently on java , produce same result consistently.
i used strict mode javascript.
are these 3 statements somehow not equivalent on javascript or missing critical here?
x = x ^ y; y = y ^ x; x = x ^ y; this works because it's like
x_1 = x_0 ^ y_0; y_1 = y_0 ^ x_1; x_2 = x_1 ^ y_1; then,
x_final = x_2 = x_1 ^ y_1 = x_0 ^ y_0 ^ y_0 ^ x_1 = x_0 ^ y_0 ^ y_0 ^ x_0 ^ y_0 = y_0 y_final = y_1 = y_0 ^ x_1 = y_0 ^ x_0 ^ y_0 = x_0; your x = x ^ (y = y ^ (x = x ^ y )); like
x_1 = x_0 ^ y_0; y_1 = y_0 ^ x_1; x_2 = x_0 ^ y_1; then,
x_final = x_2 = x_0 ^ y_1 = x_0 ^ y_0 ^ x_1 = x_0 ^ y_0 ^ x_0 ^ y_0 = 0 y_final = y_1 = y_0 ^ x_1 = y_0 ^ x_0 ^ y_0 = x_0; it have worked if used x = (y = y ^ (x = x ^ y )) ^ x;.
that's because js parses expressions left right, , want x modified value, not initial one.
Comments
Post a Comment