aboutsummaryrefslogtreecommitdiff
path: root/ch2
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2013-04-06 05:41:28 -0500
committerzlg <zlg@zlg.space>2013-04-06 05:41:28 -0500
commit84f1c31fcf1a073e161ece6284272ff75ee0dcf2 (patch)
treee400597c0602c76929431285602b3e932eba3dac /ch2
parentSolve Exercise 2-9: bitcount() (diff)
downloadknr-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.c14
-rw-r--r--ch2/2-10_lower.c20
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;
+}