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:
http://www.uniquecontentpro.com/?a=1231
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:
http://www.uniquecontentpro.com/?a=1231