Bit Fields & Bitwise Operations CS-2301, System Programming for Non-Majors (Slides include materials from The C Programming Language, 2nd edition, by Kernighan and Ritchie and from C: How to Program, 5th and 6th editions, by Deitel and Deitel) CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 1 Bitwise Operations • See §2.9 and §6.9 in Kernighan & Ritchie • Many situation, 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 CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 2 Review – Bitwise Operations in Integers Corresponding bits of both operands are combined by the usual logic operations. • & – AND • ~ – Complement • Result is 1 if both operand bits are 1 • Each bit is reversed • | – OR • << – Shift left • Result is 1 if either operand bit is 1 • Multiply by 2 • ^ – Exclusive OR • Result is 1 if operand bits are different CS-2301, B-Term 2009 • >> – Shift right • Divide by 2 Apply to all kinds of integer types:– Signed and unsigned Bit Fields 3 char,& Bitwise short, int, long, long long Operations Examples a 1 1 1 1 0 0 0 0 unsigned int c, a, b; c = a & b; c = a | b; c = a ^ b; c = ~a; b 1 0 1 0 1 0 1 0 c = a << 2; c = a >> 3; CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 4 Right Shift is Tricky unsigned int c, a; c = a >> 3; signed int c, a, b; c = b >> 3; c = a >> 3; a 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 b 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 a 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 5 Two Approaches • Traditional C • Use #define and a lot of bitwise operations • Modern • Use bit fields CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 6 Example – Printer Status Register • Traditional C definition of bit fields #define #define #define #define CS-2301, B-Term 2009 EMPTY JAM LOW_INK CLEAN 01 02 16 64 Bit Fields & Bitwise Operations 7 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 */ CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 8 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 CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 9 Example – Printer Status Register (cont.) count • An integer field (traditional style) #define COUNT (8|16|32|64|128) int c = (status & COUNT) >> 3; status |= (c << 3) & COUNT; CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 10 “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 CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 11 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; }; CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 12 Example – Printer Status Register (cont.) count 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; }; CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 13 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; CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 14 Questions about Bit Fields? CS-2301, B-Term 2009 Bit Fields & Bitwise Operations 15