diff options
author | Adam Carpenter <gitlab@53hor.net> | 2019-07-22 13:36:12 -0400 |
---|---|---|
committer | Adam Carpenter <gitlab@53hor.net> | 2019-07-22 13:36:12 -0400 |
commit | c9adeb731014f88d857be2e98072807b2934f1f5 (patch) | |
tree | 9dfc96fb80fd59db50ad4247c84d8a805ebfcd10 | |
parent | c838e15b7f7124e82ba59ae92029957622fdc475 (diff) | |
download | learning-c-c9adeb731014f88d857be2e98072807b2934f1f5.tar.xz learning-c-c9adeb731014f88d857be2e98072807b2934f1f5.zip |
Finished 2-6.
-rw-r--r-- | ch2/2-6.c | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -1,15 +1,19 @@ #include<stdio.h> +/* + * Set n bits in x starting at position p to rightmost n bits of y. + */ + unsigned setbits(unsigned x, unsigned p, unsigned n, unsigned y) { - // set n bits in x starting at p to rightmost n bits of y - unsigned offset = (p + 1 - n); - unsigned y_mask = y & ~(~0 << n); - unsigned bot = x & ~(~0 << offset); - unsigned top = (x >> offset << offset) & y_mask; - unsigned result = top & bot; - return result; + 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. } int main() { printf("%x\n", setbits(0xaa, 3, 3, 0x33)); + printf("%x\n", setbits(0x00, 3, 3, 0xff)); } |