CSC 161 | Grinnell College | Spring, 2009 |
Imperative Problem Solving and Data Structures | ||
This lab provides practice in working with data at the bit level in C. Specific work involves the representation of integers, the manipulation of bits in C, and the use of unions in C to view bit patterns in multiple ways.
The C programming language contains the following bitwise operations:
operation | comment |
---|---|
& | bitwise and |
| | bitwise or |
^ | bitwise exclusive or |
~ | ones complement |
<< | shift left |
>> | shift right |
In King's book, write functions to solve exercises 20.7 (page 525), 20.9 (page 526; for part b, think recursively), and 20.10 (page 526).
In the Lab on Integer Processing, we used the C program ~walker/c/fluency-book/integer-rep.c to examine the bit representations of integers. Review that program, and explain how the print_binary procedure works. As part of your explanation, include an example for the printing of the decimal number 11.
Program ~walker/c/data-rep.c provides an alternative framework for examining the bit representations of integers and floating point numbers.
Write (on paper) the floating point numbers ± 5.0 and ± 11.0 using the IEEE floating-point representation of real numbers.
Run program ~walker/c/data-rep.c to determine the internal representation of the integers from part 1, as actually stored on PC/Linux computers, and write a paragraph that explains the bits involved with the sign, mantissa, and exponent of these numbers.
Program ~walker/c/data-rep.c uses a union in C as the basis of its processing.
DATA
type?
typedef
statement allows the type union DATA
to be identified more simply as a data
type. Explain what
data may be stored in variable d
and how that data can be
accessed.
while (1)
expression?
continue
is used in place of break
in
the default option, so execution at that spot will jump back to the top of
the loop rather than continuing with the printing that follows.]
printf
statements are straight
forward, the printBitGroups
function may require some thought.
The first use of this function comes from the call
printBitGroups (d, 1)
. Using bitGroups
as 1,
trace the execution of printBitGroups
.
value, mask
and
iterations
.
(Variable a
is an array of integers, with subscripts between 0
and 31.)
mask
after the first loop
terminates, and explain how that bit pattern is achieved.
a
array, and how are these values
determined.
value
variable is declared as
d.integer
, rather than using d.integer
directly
in the second loop of printBitGroups
.
printBitGroups (d, 4)
, and
discuss how this purpose is achieved.
mask
after the first loop
terminates, and explain how that bit pattern is achieved.
a
array, and how are these values
determined.
printBitGroups
. These conditions should be inserted as
comments to follow the function's header, but they need NOT be checked in
the code using assert
statements or other executed tests.
d
is changed to its ones complement.
d
and successively toggles successive bits of the variable --
printing the binary, hexadecimal, integer, and float values of the results
in a table. Toggling of the bits should progress from left to right.
Thus, the output might have the form:
binary | hexadecimal | integer form | float form |
00000000000000000000000000000000 | 00000000 | 0 | 0.0 |
10000000000000000000000000000000 | 80000000 | -2147483648 | -0.0 |
01000000000000000000000000000000 | 40000000 | 1073741824 | 2.0 |
... |
This document is available on the World Wide Web as
http://www.walker.cs.grinnell.edu/courses/161.sp09/labs/lab-bit-ops.shtml
created 11 September 2001 last revised 24 January 2009 |
![]() ![]() |
For more information, please contact Henry M. Walker at walker@cs.grinnell.edu. |