Contents
Your Task
-
Work on the corresponding lab first.
-
Go to the custom code environment. This is like the code environment for the lab, but with different problems.
-
Solve all of the puzzles below using restricted subset of C (described below).
The C Subset
-
You are restricted to a subset of C
- Constants cannot exceed a single byte (between 0 and 255, or 0x00 and 0xff)
- You cannot have any control constructs (no
if
,for
, etc) - You can only use
int
-type values. You can use temporary variables and multiple statements, and we encourage you to do this. - All temporary variables must be initialized on declaration (e.g.
int temporary = 0;
) - All
>>
operators are arithmetic shifts (regardless of the types involved) - Each puzzle has a limited set of operators you are allowed to use
- Each puzzle has a limit on the number of operators you are allowed to use
-
Violating any of the above rules except the number of operators will result in 0 points. Partial credit is awarded if you have the correct functionality following all of the rules except the operator count.
Hints
Testing outside the Coding environment
- You can copy-and-paste code from the coding environment to your own computer for testing.
This can let you get useful compiler error messages and add
printf()
statements, etc.
Specific advice for the puzzles
- The puzzles are not arranged in order of difficulty. You should not feel obliged to do them in order.
allEvenBits
-
A mask and emulating the
==
operator with subtraction will help. -
Recall that in two’s complement, negation is flipping all bits and adding 1.
byteSwap
- Isolate the bits that are moving into their own variables, clear their destinations in the original number, then put them back in into the number in their new locations.
multFiveEighths
-
Section 2.3.6 (“Multiplying by Constants”) and 2.3.7 (“Dividing by Powers of Two”) in the textbook have most of the solution described, if not explicitly given.
-
Arithmetic right shift is equivalent to dividing a signed integer by a power of two but always rounding down. Integer division in C always rounds towards zero.
addOK
-
Overflow with
+
will always produce a result with the wrong sign. -
(non-negative) + (negative) can never overflow.
bitParity
^
is almost all you need.
Evaluation
- Correctness points.
- Each puzzle you must solve has been given a difficulty rating between 1 and 4 and is worth that many points. This is awarded all-or-nothing per puzzle: you either obeyed the coding rules and got all inputs correct or you did not.
- Performance points.
- There are an additional 2 points per puzzle that are awarded if you use a small number of operators. Again, this is all-or-nothing: you either met the limit or you did not.
- Opt-in Competition
- You may elect to provide a publicly visible name and have the operation counts of your working code logged on a competition scoreboard.