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 a 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 addprintf()
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.