You are performing bitwise operations, and using the character
0, not the number zero, to clean things up. If you type
ord '0', you will see the zero character is 48, or 30 in hex (or see
ASCII). The
|= operator is a compound operator, which performs a
bitwise-or between the left- and right-hand sides, and then
assigns the result to the left-hand argument.
Your bitwise-xor (^) necessarily sets bits 7 and 8 to false since you only have alphabetics. The bitwise-or (|) sets the 5th and 6th bits to true. 0011xxxx (or xxx1100 if you are a little endian) corresponds to the ASCII column that contains all the numbers.
So your output is a series of numeric characters, not a number.
#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.