Description
1. [25] Consider the following C code:
#include
void printBytes(unsigned char *start, int len) {
for (int i = 0; i < len; ++i) {
printf(" %.2x", start[i]);
}
printf("\n");
}
void printInt(int x) {
printBytes((unsigned char *) &x, sizeof(int));
}
void printFloat(float x) {
printBytes((unsigned char *) &x, sizeof(float));
}
Copy and paste the above code into a file named 1-1.c and ensure that you can compile it using
gcc. Add the following functions to the file, taking the specified data type as a parameter and
calling printBytes as appropriate: printShort, printLong, printDouble.
Also write a main() function to test each of the above functions (with the exception of
printBytes, which you do not need to test directly) with reasonable inputs. Do you notice
anything unexpected regarding the output of your test functions? List any observations as
comments inline in your main function.
2. [25] Suppose we number the bytes in a 32-bit word from 0 (least significant) to 3 (most
significant). Write code for the following C function that will return an unsigned int consisting of
byte 3 from x and bytes 2 through 0 from y:
unsigned int combine (unsigned int x, unsigned int y);
Here are some test runs:
combine(0x12345678, 0xABCDEF00): 0x12CDEF00
combine(0xABCDEF00, 0x12345678): 0xAB345678
Use only bitwise operators; no if statements, loops, or arithmetic operators (+, -, *, /, %). Also
write a main() function to test your function. Name your source file 1-2.c
3. [25] Suppose we again number the bytes in a 32-bit word from 0 (least significant) to 3 (most
significant). Write code for the following C function that will return an unsigned int such that
byte i of x has been replaced by byte b:
unsigned int replace (unsigned int x, int i, unsigned char b);
Here are some test runs:
replace(0x12345678, 2, 0xAB): 0x12AB5678
replace(0x12345678, 0, 0xAB): 0x123456AB
Use only bitwise operators; no if statements, loops, or arithmetic operators (+, -, *, /, %). Also
write a main() function to test your function. Name your source file 1-3.c
4. [25] Suppose we number the bits in a 32-bit word from 0 (least significant) to 31 (most
significant). Write code for the following C function that will return 1 if x has at least one bit
with a value of 1 at an even index (including index 0), 0 otherwise (hint: use a bit mask to
isolate the even bits):
int even(unsigned int x);
Here are some test runs:
even(0x0): 0
even(0x1): 1
even(0x2): 0
even(0x3): 1
even(0xFFFFFFFF): 1
even(0xAAAAAAAA): 0
Use only bitwise operators; no if statements, loops, or arithmetic operators (+, -, *, /, %). Also
write a main() function to test your function. Name your source file 1-4.c
Zip the source files and solution document (if applicable), name the .zip file
Assignments section for submission link).