Bit Fields & Bitwise Operations CS-2303, C-Term Bit Fields & Bitwise Operations CS-2303 System Programming Concepts (Slides include materials from The C Programming Language, 2 nd edition, by Kernighan and Ritchie and from C: How to Program, 5 th and 6 th editions, by Deitel and Deitel)
Bit Fields & Bitwise Operations CS-2303, C-Term Bitwise Operations See §2.9 and §6.9 in K&R See §10.9 in D&D Many situations, need to operate on the bits of a data word – Register inputs or outputs Controlling attached devices Obtaining status Especially ECE-2801 and ECE-3803
Bit Fields & Bitwise Operations CS-2303, C-Term Review – Bitwise Operations in Integers & – AND Result is 1 if both operand bits are 1 | – OR Result is 1 if either operand bit is 1 ^ – Exclusive OR Result is 1 if operand bits are different ~ – Complement Each bit is reversed << – Shift left Multiply by 2 >> – Shift right Divide by 2 Corresponding bits of both operands are combined by the usual logic operations. Apply to all kinds of integer types:– Signed and unsigned char, short, int, long, long long
Bit Fields & Bitwise Operations CS-2303, C-Term Examples unsigned int c, a, b; c = a & b; c = a | b; c = a ^ b; c = ~a; c = a << 2; c = a >> 3; a b
Bit Fields & Bitwise Operations CS-2303, C-Term Right Shift is Tricky unsigned int c, a; c = a >> 3; signed int c, a, b; c = b >> 3; c = a >> 3; a a b
Bit Fields & Bitwise Operations CS-2303, C-Term Two Approaches Traditional C Use #define and a lot of bitwise operations Modern Use bit fields Much more frequent in real world!
Bit Fields & Bitwise Operations CS-2303, C-Term Example – Printer Status Register Traditional C definition of bit fields #define EMPTY 01 #define JAM 02 #define LOW_INK 16 #define CLEAN 64 Empty paper Paper jam Low ink Clean
Bit Fields & Bitwise Operations CS-2303, C-Term Example – Printer Status Register (cont.) Traditional bit fields (continued) char status; if (status == (EMPTY | JAM))...; if (status == EMPTY || status == JAM)...; while (! status & LOW_INK)...; int flags |= CLEAN/* turns on CLEAN bit */ int flags &= ~JAM/* turns off JAM bit */ Empty paper Paper jam Low ink Clean
Bit Fields & Bitwise Operations CS-2303, C-Term Traditional Bit Definitions Used very widely in C Including a lot of existing code No checking You are on your own to be sure the right bits are set Machine dependent Need to know bit order in bytes, byte order in words Integer fields within a register Need to AND and shift to extract Need to shift and OR to insert
Bit Fields & Bitwise Operations CS-2303, C-Term Example – Printer Status Register (cont.) An integer field (traditional style) #define COUNT (8|16|32|64|128) int c = (status & COUNT) >> 3; status |= (c << 3) & COUNT; Empty paper Paper jam Low ink Clean count
Bit Fields & Bitwise Operations CS-2303, C-Term “Modern” Bit-Field Definitions See Kernighan & Ritchie, §6.9 Like a struct, except Each member is a bit-field within a word Accessed like members of a struct Fields may be named or unnamed Machine-dependent Order of bits in word Size of word
Bit Fields & Bitwise Operations CS-2303, C-Term Modern Bit-field Definitions struct statusReg { unsigned int emptyPaperTray :1; unsigned int paperJam :1; :2; unsigned int lowInk :1; :1; unsigned int needsCleaning :1; :1; }; Empty paper Paper jam Low ink Clean
Bit Fields & Bitwise Operations CS-2303, C-Term Example – Printer Status Register (cont.) struct statusReg { unsigned int emptyPaperTray :1; unsigned int paperJam :1; :1; unsigned int count :5; :1; unsigned int lowInk :1; :1; unsigned int needsCleaning :1; :1; }; Empty paper Paper jam Low ink Clean count
Bit Fields & Bitwise Operations CS-2303, C-Term Modern Bit-fields (continued) struct statusReg s; if (s.empty && s.jam)...; while(! s.lowInk)...; s.needsCleaning = true; s.Jam = false; int c = s.count; s.count -= 1;
Bit Fields & Bitwise Operations CS-2303, C-Term Questions about Bit Fields?