寄存器操作

假设在一个32位的机器上,需要将某个外设寄存器的第X位(最低位为第0位,最高位为第31位)设置成0,将第Y位开始的连续三位设置成110(从高位到低位的顺序),而其它位保持不变。对给定的寄存器值R,及X,Y,编程计算更改后的寄存器值R。
输入的数据仅一行,包括R,X,Y,以逗号","分隔,R为16进制表示的32位整数,X,Y在0-31之间且Y>=3,(Y-X)的绝对值>=3,保证两次置位不会重合更改后的寄存器值R(16进制输出)。例如:
输入:
12345678,0,3
输出:

1234567c

/*************************************************************************
    > File Name: a.c
    > Author: 傻李
    > Mail: hellojukay@gmail.com 
    > Created Time: 2014年11月15日 星期六 18时37分42秒
 ************************************************************************/

#include<stdio.h>
void print(int);
int main()
{
	int R;
	int x,y;
	scanf("%x,%d,%d",&R,&x,&y);
	//第x位置0
	print(R);
	x = x &(~ (1UL << x));
	//Y位开始连续3位置110
	R = R | (1UL << y);
	R = R | (1UL << (y-1));
	R = R &(~ (1UL << (y-2)));
	printf("%x\n",R);
	print(R);
	return 0;
}

void print(int c)
{
	if(c>>1)
		print(c>>1);
	printf("%d",c&1);
}

还看到了另外一个人的答案,我对他的答案很好奇,我认为他是错的,结果运行了几次,发现他和我的答案是一样的,我认为或运算是不能置0的,只能置1。下面是他的代码


#include <stdio.h>    
#define CLR(r, x)    r &= ~(1UL << x)    //1UL表示32位无符号数,将r的x位清零。 
#define SET(r, y)    r |=  (1UL << y)  //表示将r的y位置零    
int main()  {  
    int r, x, y; 
    scanf("%x,%d,%d", &r,&x, &y);  

    CLR(r,x);   //清除x位
    SET(r,y);   //置位y位
    SET(r,y-1); //置位y-1位
    CLR(r,y-2);  //置位y-2位

    printf("%x", r);  
    return 0; 
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值