aboutsummaryrefslogtreecommitdiff
path: root/ch2
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ch2/2-09_bitcount.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/ch2/2-09_bitcount.c b/ch2/2-09_bitcount.c
new file mode 100644
index 0000000..d824ca6
--- /dev/null
+++ b/ch2/2-09_bitcount.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+
+/* The C Programming Language: 2nd Edition
+ *
+ * Exercise 2-9: In a two's complement number system, x &= (x-1) deletes
+ * the rightmost 1-bit in x. Explain why. Use this observation to write a
+ * 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:
+ *
+ * 110100 (52) minus 1 is
+ * 110011 (51)
+ *
+ * The & operator only masks bits off (makes them zero) if that bit in the
+ * second operand is also zero. That means...
+ *
+ * 110100 (52) &
+ * 110011 (51) is
+ * 110000
+ *
+ * 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.
+ */
+
+unsigned bitcount(unsigned x) {
+ int count = 0;
+ while (x != 0) {
+ x &= (x - 1);
+ count++;
+ }
+ return count;
+}
+
+int main() {
+ int i;
+ unsigned test[4] = { 51, 65535, 256, 10834 };
+ for (i = 0; i < 4; i++) {
+ printf("%6u has %2d ones in its binary representation.\n", test[i], bitcount(test[i]));
+ }
+ return 0;
+}
'/vgstash/commit/scripts/updater.sh?h=v0.3b6&id=7f735dbe7544bf2837b1fa5fac38d3f001a8bb99&follow=1'>Correct run_again, add recursionZe Libertine Gamer1-0/+4 Loops and functions -- oh my, what a useful combination. :) 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5 Also correct a typo. me: ensure notes are also savedzlg1-2/+2 2018-10-09cli: add 'update' commandzlg3-20/+92 2018-10-06cli: Add "delete" commandzlg2-0/+19 2018-10-06Remove ID field from DBzlg3-38/+46 2018-10-06cli: change "Status" heading to "Progress"zlg2-36/+40 2018-09-29Bump to 0.3alpha5 for PyPIzlg1-1/+1 2018-09-29cli: Add pretty printing to 'list' commandzlg3-17/+107 2018-09-08setup.py: Bump to alpha4 for PyPIzlg1-1/+1 2018-09-08cli: add '--raw' option to list commandzlg2-9/+45 2018-09-08Add remaining filters to vgstash packagezlg1-2/+11 2018-09-04Update LICENSE to match setup.pyzlg1-80/+67 2018-09-03Branch off from master with pytest, tox, clickzlg16-778/+779 2018-03-18Flesh out filter types and ownership statuszlg3-82/+144 2018-03-18README.mdown: break line correctlyzlg1-1/+1 2018-03-18add 'playlog' list filterzlg2-2/+9 2018-03-13Update helpers a bitzlg1-2/+9 2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20 2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0 2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4 2016-11-13DerpZe Libertine Gamer1-0/+1 2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23 2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5