summaryrefslogtreecommitdiff
path: root/ch2/2-7.c
diff options
context:
space:
mode:
authorAdam Carpenter <gitlab@53hor.net>2019-07-23 10:18:39 -0400
committerAdam Carpenter <gitlab@53hor.net>2019-07-23 10:18:39 -0400
commit8fcf25523124008a56515dc0b3de0a32f3283e18 (patch)
tree70307d89802759791679d52f900a195c4399fe61 /ch2/2-7.c
parentc9adeb731014f88d857be2e98072807b2934f1f5 (diff)
downloadlearning-c-8fcf25523124008a56515dc0b3de0a32f3283e18.tar.xz
learning-c-8fcf25523124008a56515dc0b3de0a32f3283e18.zip
Super simplified 2-6 2-7, added 2-8
Diffstat (limited to 'ch2/2-7.c')
-rw-r--r--ch2/2-7.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/ch2/2-7.c b/ch2/2-7.c
new file mode 100644
index 0000000..bf9fed1
--- /dev/null
+++ b/ch2/2-7.c
@@ -0,0 +1,19 @@
+#include<stdio.h>
+
+/*
+ * 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.
+ */
+
+unsigned invert(unsigned x, unsigned p, unsigned n) {
+ // Create mask where bits should be flipped.
+ unsigned mask = ~(~0 << n) << (p + 1 - n);
+
+ // Flip bits with mask.
+ return x ^ mask;
+}
+
+int main() {
+ printf("%x\n", invert(0xaa, 3, 3));
+ printf("%x\n", invert(0xff, 3, 3));
+}