2-7 编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果值,将x中从第p位开始的n个(二进制)位求反(即,1变成0,0变成1),x的其余各位保持不变。
#include<stdio.h> unsigned invert(unsigned x,int p,int n); int main(){ unsigned x=5; int p=3; int n=2; unsigned result; result = invert(x,p,n); printf("%d\n",result); return 0; } unsigned invert(unsigned x, int p, int n) { return x ^ (~(~0U << n) << (p-n)); }
此程序的关键在于, 一个数与1异或相当于求反,与0异或保持不变。 !!!!
我自己的版本:(思路混乱,还有问题!!)
#include<stdio.h> int invert(unsigned x,int p,int n); int main(){ unsigned x=5; int p=3; int n=2; unsigned result; result = invert(x,p,n); printf("%d\n",result); return 0; } int invert(unsigned x,int p,int n) { int leftn;//从第P位开始的n位后右边的部分,即p-n位 int rightp;//第p位左边的部分 leftn = x & ~(~0<<p-n);//获得最右边p-n位,其他位为0 rightp = x & (~0<<p);//获得第p位左边的位,其他位为0 unsigned tmp= leftn | rightp; //第p位开始的n位为0,其他各位均保持不变 unsigned tmp1; tmp1 = (x>>p-n) & ~(~0<<n); //得到n位,且位于最右 unsigned tmp2; tmp2 = ~tmp1; unsigned tmp3; tmp3 = tmp2 & ~(~0<n); unsigned result; result = tmp | tmp3; return result; }