Mistake in solutions to K&R?

P

poodles

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
 
D

Dik T. Winter

> 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)).
 
M

Mark McIntyre

poodles said:


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
 
R

Richard Heathfield

Mark McIntyre said:
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).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,989
Messages
2,570,207
Members
46,783
Latest member
RickeyDort

Latest Threads

Top