Goals
This assignment is designed to give you some practice with C and a bit of review on binary and hexadecimal from section.
Submission
Copy the contents of ~cs61c/hw/sp12/hw2
to a suitable location in your home directory to obtain files you will want for this homework.
mkdir ~/hw2 cp -r ~cs61c/hw/sp12/hw2/ ~/hw2In this directory, there should be files named
hw2.txt
and bitcount.c
.
Put your solutions to problems 1 and 2 in hw2.txt
, and problem 3 in bitcount.c
.
Then run
submit hw2
. Make sure both files are submitted.
Problem 1
a) Convert 10001001
in binary to decimal (under the unsigned number representation) and hexadecimal.
b) Convert 35
in decimal to binary and hexadecimal.
c) P&H (Revised 4th) exercise 2.33.2 for option b:
Convert this function into pointer-based code.
void shift(int a[], int n) { int i; for(i = 0; i != n-1; i++) a[i] = a[i+1]; }
Problem 2
a) Complete the following setName
,
getStudentID
, and setStudentID
functions.
You may assume the pointers given are valid and not null.
#define MAX_NAME_LEN 127 typedef struct { char name[MAX_NAME_LEN + 1]; unsigned long sid; } Student; /* return the name of student s */ const char* getName (const Student* s) { return s->name; } /* set the name of student s If name is too long, cut off characters after the maximum number of characters allowed. */ void setName(Student* s, const char* name) { /* fill me in */ } /* return the SID of student s */ unsigned long getStudentID(const Student* s) { /* fill me in */ } /* set the SID of student s */ void setStudentID(Student* s, unsigned long sid) { /* fill me in */ }
b) What is the logical error in the following function?
Student* makeAndrew(void) { Student s; setName(&s, "Andrew"); setStudentID(&s, 12345678); return &s; }
Problem 3
a) Write a function bitCount()
in bitcount.c
that returns the number of 1-bits in the binary representation of its
unsigned integer argument.
To compile bitcount.c
and create an executable named bitcount
:
gcc -std=c99 -o bitcount bitcount.cRemember to fill in the identification information and run the completed program to verify correctness.
/* Name: Lab section time: */ #include <stdio.h> int bitCount(unsigned int n); int main(void) { printf ("# 1-bits in base 2 representation of %u = %d, should be 0\n", 0, bitCount (0)); printf ("# 1-bits in base 2 representation of %u = %d, should be 1\n", 1, bitCount (1)); printf ("# 1-bits in base 2 representation of %u = %d, should be 17\n", 2863377066u, bitCount(2863377066u)); printf ("# 1-bits in base 2 representation of %u = %d, should be 1\n", 268435456, bitCount(268435456)); printf ("# 1-bits in base 2 representation of %u = %d, should be 31\n", 4294705151u, bitCount(4294705151u)); return 0; } int bitCount(unsigned int n) { /* your code here */ }
b) You have decided that you want your bitcount program above to work from the command-line (see K&R Section 5.10), as follows:
# ./bitcount 17 2 # ./bitcount 255 8 # ./bitcount 10 20 too many arguments! # ./bitcount [the same result as from part a]Edit your
bitcount.c
to include this functionality.
You may assume that the single argument will always be an integer in the range from 0 to 231-1. You will find the function atoi
helpful.
Extra for experts: Implement this exercise without using the library function atoi
(or something comparable). (You don't actually get extra points for this).