From 4f4d6bba86aa386ff93004f387e94a79446cff0f Mon Sep 17 00:00:00 2001 From: Isidro Arias Date: Sun, 16 Feb 2025 19:11:46 +0100 Subject: [PATCH 1/2] Change meaning of `p` argument Previusly: counted from the right of n xxx..xnnnnx..xxx p 0 Now: counted from the left of n (like the book) xxx..xnnnnx..xxx p 0 --- chapter-2-types-operators-expressions/11.setbits.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chapter-2-types-operators-expressions/11.setbits.c b/chapter-2-types-operators-expressions/11.setbits.c index 7dea630..bab5ffb 100644 --- a/chapter-2-types-operators-expressions/11.setbits.c +++ b/chapter-2-types-operators-expressions/11.setbits.c @@ -16,8 +16,8 @@ main() int setbits(int x, int p, int n, int y) { - x = x & (~((~(~0 << n)) << p)); - y = (y & (~(~0 << n))) << p; + x = x & (~((~(~0 << n)) << (p - n + 1))); + y = (y & (~(~0 << n))) << (p - n + 1); return x | y; } From 5a98acf3d242c9058df56345dddb24054f977df6 Mon Sep 17 00:00:00 2001 From: Isidro Date: Mon, 20 Jan 2025 04:16:50 +0100 Subject: [PATCH 2/2] refactor setbits() --- .../11.setbits.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/chapter-2-types-operators-expressions/11.setbits.c b/chapter-2-types-operators-expressions/11.setbits.c index bab5ffb..165e66b 100644 --- a/chapter-2-types-operators-expressions/11.setbits.c +++ b/chapter-2-types-operators-expressions/11.setbits.c @@ -16,9 +16,23 @@ main() int setbits(int x, int p, int n, int y) { - x = x & (~((~(~0 << n)) << (p - n + 1))); - y = (y & (~(~0 << n))) << (p - n + 1); + /* xxx............xxx x */ + /* yyy...........ynnn y */ + /* least significant position of the bits touched */ + int r = p - n + 1; + + /* 000...011110...000 mask */ + /* p r ...210 position */ + int mask = ~(~0 << p + 1) & (~0 << r); + + /* 000...0nnnn0...000 */ + y = (y << r) & mask; + + /* xxx...x0000x...xxx */ + x = x & ~mask; + + /* xxx...xnnnnx...xxx */ return x | y; }