Usually, something like your 'status' variable is used to hold flags (such as PAPER_OUT). What you do is you assign each flag a unique bit. Something like this:
#define VAL1 0x1 // 00000001
#define VAL2 0x2 // 00000010
#define VAL3 0x4 // 00000100
#define VAL4 0x8 // 00001000
#define VAL5 0x10 // 00010000
#define VAL6 0x20 // 00100000
#define VAL7 0x40 // 01000000
#define VAL8 0x80 // 10000000
That way you can set flags in the variable. Something like status = VAL4 | VAL5
would set the status to 00011000. So you can probably see where this is going. Each flag has to only set 1 bit so values like 3, 5, 7, etc. wouldn't work since they look like 00000011, 00000101, 00000111, etc.
So to set a flag you use the | operator.
To query a flag you use the & operator.
To clear a flag you'd use & coupled with ^. Something like status &= ^VAL2
(status = 01100110 & 11111101
which would give you all the bits that were set before except the 2nd).
C interprets anything that's not 0 as true, like ToniT said. Not sure if that's enough detail. Let me know if you need more