diff options
author | Adam Carpenter <gitlab@53hor.net> | 2019-07-23 10:18:39 -0400 |
---|---|---|
committer | Adam Carpenter <gitlab@53hor.net> | 2019-07-23 10:18:39 -0400 |
commit | 8fcf25523124008a56515dc0b3de0a32f3283e18 (patch) | |
tree | 70307d89802759791679d52f900a195c4399fe61 /ch2/2-6.c | |
parent | c9adeb731014f88d857be2e98072807b2934f1f5 (diff) | |
download | learning-c-8fcf25523124008a56515dc0b3de0a32f3283e18.tar.xz learning-c-8fcf25523124008a56515dc0b3de0a32f3283e18.zip |
Super simplified 2-6 2-7, added 2-8
Diffstat (limited to 'ch2/2-6.c')
-rw-r--r-- | ch2/2-6.c | 15 |
1 files changed, 9 insertions, 6 deletions
@@ -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; } |