The blood types we usually talk about are determined by the presence or absence of three antigens (A, B, and Rh-D). Here’s a table, where presence of an antigen is denoted by a 1 (true) and absence, by a 0 (false).
| A | B | Rh-D | Type |
| 0 | 0 | 0 | O- |
| 0 | 0 | 1 | O+ |
| 0 | 1 | 0 | B- |
| 0 | 1 | 1 | B+ |
| 1 | 0 | 0 | A- |
| 1 | 0 | 1 | A+ |
| 1 | 1 | 0 | AB- |
| 1 | 1 | 1 | AB+ |
You will reject a blood donation if it contains an antigen that your own blood does not. This is why O- is the “universal donor” (none of those antigens to reject) and AB+ is the “universal recipient” (you have them all naturally, so nothing is rejected). Let’s make a truth table for this, just for the A antigen:
| Donor A | Recipient A | Can accept |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Does that look familiar? It should; it’s the logical implication operation. So a person can receive another’s blood if the donor’s blood type bitwise implies the recipient’s blood type. Neat.