150 likes | 242 Views
Bit Fields & Bitwise Operations. CS-2301, System Programming for Non-Majors (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). Bitwise Operations.
E N D
Bit Fields & Bitwise Operations CS-2301, System Programmingfor 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) Bit Fields & Bitwise Operations
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 Bit Fields & Bitwise Operations
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 unsignedchar, short, int, long, long long Bit Fields & Bitwise Operations
Examples unsigned int c, a, b; c = a & b; c = a | b; c = a ^ b; c = ~a; c = a << 2; c = a >> 3; b a 1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 0 Bit Fields & Bitwise Operations
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 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 Bit Fields & Bitwise Operations
Two Approaches • Traditional C • Use #define and a lot of bitwise operations • Modern • Use bit fields Bit Fields & Bitwise Operations
Example – Printer Status Register Traditional C definition of bit fields #define EMPTY 01 #define JAM 02 #define LOW_INK 16 #define CLEAN 64 Clean Low ink Paper jam Empty paper Bit Fields & Bitwise Operations
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 */ Clean Low ink Paper jam Empty paper Bit Fields & Bitwise Operations
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
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; count Clean Low ink Paper jam Empty paper Bit Fields & Bitwise Operations
“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
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; }; Clean Low ink Paper jam Empty paper Bit Fields & Bitwise Operations
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; }; count Clean Low ink Paper jam Empty paper Bit Fields & Bitwise Operations
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
Questions about Bit Fields? Bit Fields & Bitwise Operations