WORD is probably an unsigned int. You should check that out.
I'm sure the comparisons you propose are completely safe.
The code below is just one example, one machine, one compiler, but it shows some of the implicit bit manipulation.
Code:
#include <stdio.h>
struct {
unsigned a:1;
unsigned b:1;
unsigned c:2;
} bits;
enum {NOTHING=0, ONE, TWO, THREE};
int main(void) {
bits.c = THREE;
if (bits.c == THREE)
printf("yo\n");
return 0;
}
/*
# Partial disassembly:
# bits.c = THREE;
movzbl _bits, %eax # movzbl means "move zero-extended byte to long"
orl $12, %eax # 12 == 00000000 00000000 00000000 00001100
movb %al, _bits
# if (bits.c == THREE)
movzbl _bits, %eax
andl $12, %eax
cmpb $12, %al
jne L2
movl $LC0, (%esp) # LC0 is the address of the string "yo\0"
call _puts
L2:
*/