Bit Fields & Bitwise Operations

advertisement
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
Download