These are all bitwise operations. A char is normally a signed 8 bit variable. So, what you are doing is getting the value of '0', 48, 0x30 or 0011 0000 (ascii, decimal, hexadecimal and binary respectively). Then, you can follow the bit shifting to work out the value. Note that because its signed, the first bit is either 0 (for positive) or 1 (for negative), and doesn't take part in the actual value of the number.
EDIT: Also, note that the shifts seem to be making the number an int (or anything larger than 8-bits in size), because it has gone larger than the maximum value for a signed char (127).