diff options
author | zlg <zlg@zlg.space> | 2013-04-06 05:41:28 -0500 |
---|---|---|
committer | zlg <zlg@zlg.space> | 2013-04-06 05:41:28 -0500 |
commit | 84f1c31fcf1a073e161ece6284272ff75ee0dcf2 (patch) | |
tree | e400597c0602c76929431285602b3e932eba3dac /ch2 | |
parent | Solve Exercise 2-9: bitcount() (diff) | |
download | knr-84f1c31fcf1a073e161ece6284272ff75ee0dcf2.tar.gz knr-84f1c31fcf1a073e161ece6284272ff75ee0dcf2.tar.bz2 knr-84f1c31fcf1a073e161ece6284272ff75ee0dcf2.tar.xz knr-84f1c31fcf1a073e161ece6284272ff75ee0dcf2.zip |
Solve Exercise 2-10: lower()
Also added more information to 2-09's comments.
Diffstat (limited to 'ch2')
-rw-r--r-- | ch2/2-09_bitcount.c | 14 | ||||
-rw-r--r-- | ch2/2-10_lower.c | 20 |
2 files changed, 33 insertions, 1 deletions
diff --git a/ch2/2-09_bitcount.c b/ch2/2-09_bitcount.c index d824ca6..6ad6086 100644 --- a/ch2/2-09_bitcount.c +++ b/ch2/2-09_bitcount.c @@ -7,7 +7,7 @@ * faster version of bitcount. * * Answer: Subtracting 1 from a number reverses the rightmost 1 bit and - * replaces all lower-order bits to 0. So for example: + * replaces all lower-order bits to 1. So for example: * * 110100 (52) minus 1 is * 110011 (51) @@ -22,6 +22,18 @@ * Why? Because the 2nd operand (51) is only masking off two fields, the 3rd * and 4th (which are zeros). The rightmost 1-bit in the 1st operand (52) is * in that mask, so it goes poof. + * + * Oh, and here's the in-book version of bitcount(): + * + * int bitcount(unsigned x) { + * int b; + * for (b = 0; x != 0; x >>= 1) { + * if (x & 01) { + * b++; + * } + * } + * return b; + * } */ unsigned bitcount(unsigned x) { diff --git a/ch2/2-10_lower.c b/ch2/2-10_lower.c new file mode 100644 index 0000000..fe0288b --- /dev/null +++ b/ch2/2-10_lower.c @@ -0,0 +1,20 @@ +#include <stdio.h> + +/* The C Programming Language: 2nd Edition + * + * Exercise 2-10: Rewrite the function 'lower', which converts upper case + * letters to lower case, with a conditional expression instead of if-else. + * + * Answer: The tertiary ?: operators also _evaluate_, so they can be used in + * a lot of different places. + */ + +int lower(int c) { + return (c >= 'A' && c <= 'Z') ? c + 'a' - 'A' : c; +} + +int main() { + char foo = 'F'; + printf("The follow letter should be lowercase: %c\n", lower(foo)); + return 0; +} |