summaryrefslogtreecommitdiff
path: root/ch2
diff options
context:
space:
mode:
Diffstat (limited to 'ch2')
-rw-r--r--ch2/2-6.c15
-rw-r--r--ch2/2-7.c19
-rw-r--r--ch2/2-8.c21
3 files changed, 49 insertions, 6 deletions
diff --git a/ch2/2-6.c b/ch2/2-6.c
index 0932206..918f583 100644
--- a/ch2/2-6.c
+++ b/ch2/2-6.c
@@ -5,15 +5,18 @@
*/
unsigned setbits(unsigned x, unsigned p, unsigned n, unsigned y) {
- p++; // We're actually interested in p+1.
- unsigned offset = (p - n); // Calculate offset of y bits being inserted into x.
- unsigned lower_x = x & ~(~0 << offset); // Grab LSBs of x to save.
- unsigned y_mask = (y & ~(~0 << n)) << offset; // Grab pattern from LSBs of y.
- x = x >> p << p; // Just keep MSBs of x.
- return x | y_mask | lower_x; // Concatenate MSBs of x with LSB pattern from y with LSBs of x.
+ // Create a basa from x that zeroes out all of the bits to be set.
+ unsigned a = x & ~(~(~0 << n) << (p + 1 - n));
+
+ // Create a mask from y that zeroes out all of the bits except those to set.
+ unsigned b = (y & ~(~0 << n)) << (p + 1 - n);
+
+ // Apply the mask to the base.
+ return a | b;
}
int main() {
printf("%x\n", setbits(0xaa, 3, 3, 0x33));
printf("%x\n", setbits(0x00, 3, 3, 0xff));
+ return 0;
}
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));
+}
diff --git a/ch2/2-8.c b/ch2/2-8.c
new file mode 100644
index 0000000..9f7adbd
--- /dev/null
+++ b/ch2/2-8.c
@@ -0,0 +1,21 @@
+#include<stdio.h>
+
+/*
+ * Returns the value of the integer x rotated to the right by n bit positions.
+ */
+
+unsigned rightrot(unsigned x, int n) {
+ unsigned mask = ~(~0 >> 1);
+
+ while (n-- > 0)
+ if (x & 1)
+ x = (x >> 1) | mask;
+ else
+ x >>= 1;
+
+ return x;
+}
+
+int main() {
+ printf("%x\n", rightrot(0xaa, 3));
+}