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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值