编写一个函数,该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x其余各位保持不变。

#include <stdio.h>
unsigned setbits(unsigned x,int p, int n,unsigned y);
/*
需求2-6:编写一个函数setbits(unsigned x,unsigned p,unsigned n,unsigned y),该函数返回对x执行下列操作后的结果值:
将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x其余各位保持不变。
思路: 
首先获取y最右边的值,可利用按位与运算符:~(~0<<n)设置移到右边n位全为1的屏蔽码,得y中最右边n位的值
这时,需要将所得值插入其中,所得值左移n位,并与x进行按位异或运算,得其值。 
设计:
1.y与 ~(~0<<n)进行按位与运算
2.得值左移n位
3.与x进行按位异或运算
错误原因:
(n<<(y & ~(~0<<n)):得到y中最右边n位的值左移并未保证与x中p位对齐;
((n<<(y & ~(~0<<n))) ^ x):与x进行异或运算不具有普适性。 
eg:
x:0000 0011
y:0001 0011
v:0001 1011
setbits(x,3,2,y);
 
*/
int main(){
	unsigned v = setbits(3,3,2,19);
	printf("%d\n",v);
	return 0;
} 

/*
错误代码 
错误原因:
(n<<(y & ~(~0<<n)):得到y中最右边n位的值左移并未保证与x中p位对齐;
((n<<(y & ~(~0<<n))) ^ x):与x进行异或运算不具有普适性。 
*/ 
//unsigned setbits(unsigned x,int p,int n,unsigned y){
//	return ((n<<(y & ~(~0<<n))) ^ x);
//}

/**
standard answer
1.(p + 1 - n) << ~(~0 << n):设置屏蔽码,将从p开始的n位设置位0
2.x & ~( (p + 1 - n) << ~(~0 << n)):进行AND运算,将x中p开始的n位设置位0
3.y & ~(~0 << n):y与屏蔽码进行AND操作,选出了y最右端的n位
4.(y & ~(~0 << n)) << (p + 1 - n):选出的y端的n位进行左移操作,对齐x中p开始的n位
5.进行或运算即可 
本题解题思路:将x替换之处清0,得到目标位对齐进行操作 
p + 1 - n:保证左移到p所对应的位置 
*/
unsigned setbits(unsigned x,int p, int n,unsigned y){
	return x & ~( (p + 1 - n) << ~(~0 << n)) | (y & ~(~0 << n)) << (p + 1 - n);
}
输出结果:
15
总结:一般对为进行操作时,~|&,运算符运用为多
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值