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;
}
位操作函数实现
本文介绍了一个位操作函数invert(x,p,n)的实现方法,该函数用于将整数x中从第p位开始的n个二进制位进行取反操作,并保持其他位不变。提供了两种不同的实现方式,一种简洁高效,另一种则较为复杂但仍具参考价值。
2878





