From 3529fb7a854a969f7fadf0d5310c659b933ea276 Mon Sep 17 00:00:00 2001 From: zlg Date: Wed, 3 Apr 2013 07:15:17 -0500 Subject: Solve Exercise 2-07: invert() --- ch2/2-07_invert.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 ch2/2-07_invert.c diff --git a/ch2/2-07_invert.c b/ch2/2-07_invert.c new file mode 100644 index 0000000..244f854 --- /dev/null +++ b/ch2/2-07_invert.c @@ -0,0 +1,38 @@ +#include + +/* The C Programming Language: 2nd Edition + * + * Exercise 2-07: Write a function invert(x,p,n) that returns x with the n bits + * that begin at position p inverted (i.e. 1 changed into 0 and vice-versa), + * leaving the others unchanged. + * + * Answer: The trick is to start with ~0 to get all 1s, then left-shift n + * times. After that, flip again to get n number of 1s. Next, left shift the + * appropriate number of times needed to line up the mask of 1s to the proper + * location. Apply that mask to x with XOR and bam, job done! + * + * Here's a step by step illustration of invert(205, 5, 4), assuming 16-bit + * unsigned integers: + * + * 1111111111111111 ~0 + * 1111111111110000 << 4 + * 0000000000001111 ~ + * 0000000000011110 << (5 - 4 == 1) + * + * Mask created. Now let's take our original number... + * 0000000011001101 205 + * #### ^ ...and apply the mask! + * 0000000011010011 End Result (211) + */ + +unsigned invert(unsigned x, unsigned p, unsigned n) { + return x ^ ((~(~0 << n)) << (p - n)); +} + +int main() { + printf("invert(205, 5, 4) returns %d\n", invert(205, 5, 4)); + printf("11001101 flips 110[0110]1 to produce...\n11010011\n"); + printf("invert(1876, 7, 3) returns %d\n", invert(1876, 7, 3)); + printf("11101010100 flips 1110[101]0100 to produce...\n11100100100\n"); + return 0; +} -- cgit v1.2.3-70-g09d2 input type='hidden' name='id' value='3ec2a2902caaf3e70deea650425339299af5d821'/>
AgeCommit message (Expand)AuthorFilesLines
2018-10-12cli: Add zero-game import/export messageszlg2-11/+18
2018-10-10Bump to 0.3beta1 for PyPIzlg1-1/+1
2018-10-10Move tests and data to dedicated directoryzlg7-10/+26
2018-10-10cli: Add "export" commandzlg2-5/+54
2018-10-10cli: Add "import" commandzlg5-1/+76
2018-10-09Bump to 0.3alpha6 for PyPIzlg1-1/+1
2018-10-09cli: Add "notes" commandzlg2-4/+74
2018-10-09update_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