For each operation, the colors are first split into their component R, G, and B parts. Then the operations are performed as follows:
add: new R = R1+R2. new G = G1 + g2. new B = B1 + B2. If R, G, or B ends up greater than FF, it is set to FF.
xor: a bitwise xor is performed on all values. 1 xor 0 = 1. 1 xor 1 = 0. 0 xor 0 = 0.
multiply: R, G, and B are converted to a value between 0.0 and 1.0 and then multiplied. The colors will therefore always get darker, unless one of them is FF. The result is multipled by 255 to get back to a hex.
subtract: new R = R1-R2. new G = G1 - g2. new B = B1 - B2. If R, G, or B ends up less than 0, it is set to 0.
abs val subtract: new R = abs(R1-R2). new G = abs(G1 - g2). new B = abs(B1 - B2).
and: a bitwise and is performed on all values: 0 and x = 0. 1 and x = x.
or: a bitwise or is performed on all values: 1 or x = 1. 0 or x = x.
min: new R = the smaller of R1 and R2, etc.
max: new R = the bigger of R1 and R2, etc.
avg: new R = the average of R1 and R2, etc.