diff options
author | Adam Carpenter <gitlab@53hor.net> | 2019-07-23 12:09:24 -0400 |
---|---|---|
committer | Adam Carpenter <gitlab@53hor.net> | 2019-07-23 12:09:24 -0400 |
commit | 552bc70b77d4fca54929b46190128721b93d887c (patch) | |
tree | 2793d5aff4fce6b27e1056f89b09b52d41134a4b /ch2/2-06.c | |
parent | e41bafc5885aac630b6d19893e9c80cc334497c2 (diff) | |
download | learning-c-552bc70b77d4fca54929b46190128721b93d887c.tar.xz learning-c-552bc70b77d4fca54929b46190128721b93d887c.zip |
Cleaned up directory.
Diffstat (limited to 'ch2/2-06.c')
-rw-r--r-- | ch2/2-06.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/ch2/2-06.c b/ch2/2-06.c new file mode 100644 index 0000000..918f583 --- /dev/null +++ b/ch2/2-06.c @@ -0,0 +1,22 @@ +#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) { + // 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; +} |