By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,148 Members | 1,373 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,148 IT Pros & Developers. It's quick & easy.

Mistake in solutions to K&R?

P: n/a
This post lists a possible error in the solution to Exercise 2-7, page
49 (K&R) on the webpage
http://users.powernet.co.uk/eton/kandr2/krx207.html
Question:

Write a function invert(x,p,n) that 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.

The return statement on the webpage is

return x ^ (~(~0U << n) << p);

which is (possibly) incorrect; I've made the following one which is
correct (please correct me if it isn't):

return x^((~(~0U<<(p+1))>>(p+1-n))<<(p+1-n));

Explanation:

Take a number 1 1000 1000, say, and p=7 and n=4 then the answer should
be 1 0111 1000

In the original code the following steps take place:

1) 0000 0000 0000 0000 0000 0000 0000 0000 //0U

2) 1111 1111 1111 1111 1111 1111 1111 1111 //~

3) 1111 1111 1111 1111 1111 1111 1111 0000 //<<n

4) 0000 0000 0000 0000 0000 0000 0000 1111 //~

5) 0000 0000 0000 0000 0000 0111 1000 0000 //<< p

6) 0000 0000 0000 0000 0000 0001 1000 1000 //x itself

7) 0000 0000 0000 0000 0000 0110 0000 1000 //x^ (value in
step 5)

which is the wrong answer.

In my code, the following steps take place:

1) 0000 0000 0000 0000 0000 0000 0000 0000 //0U

2) 1111 1111 1111 1111 1111 1111 1111 1111 //~

3) 1111 1111 1111 1111 1111 1111 0000 0000 //<<p+1

4) 0000 0000 0000 0000 0000 0000 1111 1111 //~

5) 0000 0000 0000 0000 0000 0000 0000 1111 //>>p+1-n

6) 0000 0000 0000 0000 0000 0000 1111 0000 //<<p+1-n

7) 0000 0000 0000 0000 0000 0001 1000 1000 //x itself

7) 0000 0000 0000 0000 0000 0001 0111 1000 //x^ (value in
step 6)

which is, hopefully, the correct answer.

Examples

#1. (Same as above)

Take the number

392.d=110001000.b

Then if p=7 and n=4, then the answer after reversal will be:

376.d=101111000.b

This is what the code I made gives as the answer.

The answer the code on the website gives is

1544.d=11000001000.b

#2.

Take the number

588.d=1001001100.b

Then if p=7 and n=7, then the answer after reversal will be:

690.d=1010110010.b

This is what the code I made gives as the answer.

The answer the code on the website gives is

15820.d=11110111001100.b
----------------------------------------------------------------------------------------------------------------------
P.S: in the main() function on the same page, which was written "in a
hurry while tired", it's likely that n and p have been accidentally
reversed (that's not a mistake, anyway).

================================================== =========
Do you make Adsense Websites?
If the answer is yes, checkout this website out:
http://www.uniquecontentpro.com/?a=1231

Jun 27 '06 #1
Share this Question
Share on Google+
4 Replies


P: n/a
poodles said:
This post lists a possible error in the solution to Exercise 2-7, page
49 (K&R) on the webpage
http://users.powernet.co.uk/eton/kandr2/krx207.html


I have no control over that site any more, so I can't make any corrections
that may be necessary.

http://www.clc-wiki.net/ has taken over the maintenance of the answers page.
The relevant page is
http://www.clc-wiki.net/wiki/K%26R2_...2%3AExercise_7

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
Jun 27 '06 #2

P: n/a
In article <11**********************@i40g2000cwc.googlegroups .com> "poodles" <ch*****@gmail.com> writes:
This post lists a possible error in the solution to Exercise 2-7, page
49 (K&R) on the webpage
http://users.powernet.co.uk/eton/kandr2/krx207.html
Question:

Write a function invert(x,p,n) that 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.

The return statement on the webpage is

return x ^ (~(~0U << n) << p);


Should be x ^ (~(~0U << n) << (p + 1 - n)).
--
dik t. winter, cwi, kruislaan 413, 1098 sj amsterdam, nederland, +31205924131
home: bovenover 215, 1025 jn amsterdam, nederland; http://www.cwi.nl/~dik/
Jun 27 '06 #3

P: n/a
On Tue, 27 Jun 2006 10:22:43 +0000, in comp.lang.c , Richard
Heathfield <in*****@invalid.invalid> wrote:
poodles said:
This post lists a possible error in the solution to Exercise 2-7, page
49 (K&R) on the webpage
http://users.powernet.co.uk/eton/kandr2/krx207.html


I have no control over that site any more, so I can't make any corrections
that may be necessary.


In that case, is there some way to get the site dropped? It seems
risky to have your name attached to something you no longer control.
--
Mark McIntyre

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are,
by definition, not smart enough to debug it."
--Brian Kernighan
Jun 27 '06 #4

P: n/a
Mark McIntyre said:
On Tue, 27 Jun 2006 10:22:43 +0000, in comp.lang.c , Richard
Heathfield <in*****@invalid.invalid> wrote:
poodles said:
This post lists a possible error in the solution to Exercise 2-7, page
49 (K&R) on the webpage
http://users.powernet.co.uk/eton/kandr2/krx207.html


I have no control over that site any more, so I can't make any corrections
that may be necessary.


In that case, is there some way to get the site dropped? It seems
risky to have your name attached to something you no longer control.


It doesn't seem to have done me any harm, except for situations such as the
current one. Asking the provider to drop the site is likely to break quite
a few live links on other sites, and I'm loathe to initiate that process
(although I know it's bound to happen anyway, eventually).

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
Jun 27 '06 #5

This discussion thread is closed

Replies have been disabled for this discussion.