aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2013-03-31 05:38:14 -0500
committerzlg <zlg@zlg.space>2013-03-31 05:38:14 -0500
commit06c2a9d69b05cc717299b0325f5001ff0303eecf (patch)
tree3a3aded1df9d24702b3ebb93c96cbf5b5e74383e
parentSolve Exercise 2-5: The any() function (diff)
downloadknr-06c2a9d69b05cc717299b0325f5001ff0303eecf.tar.gz
knr-06c2a9d69b05cc717299b0325f5001ff0303eecf.tar.bz2
knr-06c2a9d69b05cc717299b0325f5001ff0303eecf.tar.xz
knr-06c2a9d69b05cc717299b0325f5001ff0303eecf.zip
Solve Exercise 2-6: setbits()
Diffstat (limited to '')
-rw-r--r--ch2/2-06_setbits.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/ch2/2-06_setbits.c b/ch2/2-06_setbits.c
new file mode 100644
index 0000000..67c3efc
--- /dev/null
+++ b/ch2/2-06_setbits.c
@@ -0,0 +1,44 @@
+#include <stdio.h>
+
+/* The C Programming Language: 2nd Edition
+ *
+ * Exercise 2-6: Write a function setbits(x,p,n,y) that returns x with the n
+ * bits that begin at position p set to the rightmost bits of y, leaving the
+ * other bits unchanged.
+ *
+ * Answer: The book hands you the function you need to get this done: getbits.
+ * To be honest I don't fully understand the function, and this portion of the
+ * chapter is very poorly explained. For instance, what is a lower order bit?
+ * What is a right-adjusted bit field? Further, why are octal numbers used for
+ * binary operations when each octal bit is only 3 binary bits long? It would
+ * make more sense to use hexadecimal.
+ *
+ * At any rate, getbits()'s p parameter is the position from the right side of
+ * a binary number. The far right bit is position 0 (zero), and n is the number
+ * of binary fields it should take, reading to the right. This behavior wasn't
+ * entirely obvious.
+ *
+ * Anyway, setbits() clears the right-most n bits of y and replaces them with
+ * the result of getbits(). It took a little clever thought, but it works. :)
+ */
+
+unsigned getbits(unsigned x, int p, int n) {
+ return (x >> (p + 1 - n)) & ~(~0 << n);
+}
+
+unsigned setbits(unsigned x, unsigned p, unsigned n, unsigned y) {
+ /* ~0 << n sets the rightmost n fields to zero. Using & on that clears them
+ * from the end of y. Then using | on the result of getbits() sets them to
+ * the end of y, where they belong. */
+ return y & (~0 << n) | getbits(x, p, n);
+}
+
+int main() {
+ printf("With x as 74, p as 5, n as 4, and y as 0, setbits returns %d\n", setbits(74, 5, 4, 0));
+ printf("1[0010]00 to 000[0000], creating 0000010\n\n");
+ printf("With x as 90, p as 3, n as 2, and y as 20, setbits returns %d\n", setbits(90, 3, 2, 20));
+ printf("101[10]10 to 00101[00], creating 0010110\n\n");
+ printf("With x as 256, p as 8, n as 1, and y as 14, setbits returns %d\n", setbits(256, 8, 1, 14));
+ printf("[1]00000000 to 00000111[0], creating 000001111\n");
+ return 0;
+}
p;id=bf567438a9720c18f7e0045f4b198cf143fa7053&follow=1'>update_game: 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