C程序设计语言(第二版) 2-7 ☆

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;
	
}

 

你可能感兴趣的:(C++,c,C#,D语言)