From 8fcf25523124008a56515dc0b3de0a32f3283e18 Mon Sep 17 00:00:00 2001 From: Adam Carpenter Date: Tue, 23 Jul 2019 10:18:39 -0400 Subject: Super simplified 2-6 2-7, added 2-8 --- ch2/2-6.c | 15 +++++++++------ ch2/2-7.c | 19 +++++++++++++++++++ ch2/2-8.c | 21 +++++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 ch2/2-7.c create mode 100644 ch2/2-8.c 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 + +/* + * 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 + +/* + * 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)); +} -- cgit v1.2.3