Expand/Shrink

xor_bits

Definition: atom x3 = xor_bits(atom x1, atom x2)
Description: Perform the logical XOR (exclusive OR) operation on corresponding bits in x1 and x2.
A bit in x3 will be 1 when one of the two corresponding bits in x1 or x2 is 1, and the other is 0.
pwa/p2js: Supported.
Comments: This function may be applied to an atom or sq_xor_bits() to all elements of a sequence.
The rules for sequence operations apply.

The arguments must be representable as 32-bit numbers, either signed or unsigned.

If you intend to manipulate full 32-bit values, you should declare your variables as atom, rather than integer. The integer type is limited to 31-bits.

Results are treated as signed numbers. They will be negative when the highest-order bit is 1.

Caution: many cryptographic functions and the like require unsigned 32-bit integers, especially when bit-shifting, for which xor_bitsu() can be used instead. See also example 2 below.

Unlike and_bits() and or_bits(), there is no infix operator alternative to xor_bits().
Example 1:
a = xor_bits(#0110, #1010)
-- a is #1100
Example 2: The following discrepancy was noted during the rosettacode PCG32 task:

atom x = #909E8125,
     l = x << 32,
--   l = and_bitsu(x << 32,#FFFFFFFF),
     a = xor_bitsu(x,l),
     u = and_bitsu(a,#FFFFFFFF)
printf(1,"x:%x, l:%x, a:%x (%d)\n",{x,l,a,u})
-- 32bit: x:909E8125, l:909E812500000000, a:909E8125 (2426306853)
-- 64bit: x:909E8125, l:909E812500000000, a:80000000909E8125 (0)
-- as commented out (both): x:909E8125, l:0, a:909E8125 (2426306853)

Technically, of course, you could easily argue that is an outright bug, but to cut a long rant about CPU/FPU/SSE instructions short, it is far easier just to say that sometimes for consistency between 32 and 64 bit you may have to explicitly enforce the 32-bit aspect.
Implementation: pilx86.e emits inline binary directly for two initialised integers, otherwise a call to :%opXorBits in builtins\VM\pMath.e
xor_bitsu() is currently implemented in builtins/ubits.e (also an autoinclude), though that could probably be improved on, if needed.
See Also: and_bits, or_bits, not_bits, int_to_bits, int_to_bytes