寄存器操作

假设在一个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: [email protected]
    > 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;
}
时间: 2024-08-01 11:40:11

寄存器操作的相关文章

I.MX6 AR8031 寄存器操作

/*************************************************************************** * I.MX6 AR8031 寄存器操作 * 说明: * 解读一下AR8031这颗PHY的寄存器要如何操作,了解PHY的MDIO是如何操作的. * * 2017-4-12 深圳 龙华民治樟坑村 曾剑锋 ************************************************************************

STM8L外部中断 为何 死循环 寄存器操作

STM8L 系列单片机是 ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册.  这是第一次使用STM8,实现功能不是很复杂就没想研究库函数,准备直接控制寄存器操作,没想到本人 因为中断问题纠结了大半天. 在外部中断中这一点很不同, STM8S自动清除外部中断,而STM8L是需要软件清除, 清除标志位的寄存器根据设置而不同,下面有说明. 下面以STM8L外部中断 PB1为例 说明外部中断 寄存器操作 设置外部中断有下面几步: 第一步.

射频识别技术漫谈(22)——RC系列射频芯片的寄存器操作

前面提到,RC系列内部64个寄存器的正确操作是软件编写的关键.正确设置寄存器首先要做到与寄存器正确通信,其次是要对寄存器写入正确的值. RC系列射频芯片与微控制器的接口有并口和SPI接口两种类型.显然,并口通讯速度快,需要占用的微控制器I/O多,SPI通讯速度慢,但需要的微控制器I/O口少.这里需要特别说明的是,速度的快慢仅体现在控制单元与RC系类芯片本身的通讯速率上,而不影响芯片与标签或卡片的通讯速度,芯片与标签或卡片的通讯速度是由国际标准规定的,任何芯片都必须遵守国际标准. 并口方式下RC系

STM32---初学者用库函数好还是直接对寄存器操作比较好

引用:http://blog.csdn.net/u010349006/article/details/416 首先,两个都是C语言.从51过渡过来的话,就先说寄存器操作.每个MCU都有自己的寄存器,51是功能比较简单的一种,相应的寄存器也比较少,我们常用的就那么几个,像P0 P1 SMOD TMOD之类的,这些存在于标准头文件reg.h里面,因为少,所以大家就直接这么去操作了,每一位对应的意义随便翻一下手册就看得到,甚至做几个小项目就记的很清楚了.所以做51开发的时候大多数都是直接操作寄存器.到

STM32 下的库函数和寄存器操作比较

以 led闪烁中的flashLed函数例子: 库函数操作简单,但是效率不如寄存器操作的高: 寄存器操作很复杂,因为要熟悉上百个寄存器,但是程序效率很高 /**下面是通过直接操作库函数的方式实现IO控制**/ while(1) { GPIO_ResetBits(GPIOB,GPIO_Pin_9); //LED0对应引脚GPIOF.9拉低,亮 等同LED0=0; GPIO_SetBits(GPIOB,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1; del

海思寄存器操作【转】

如何查看和修改寄存器 在程序中可以使用HI_SYS_ReadRegister,HI_SYS_WriteRegister接口进行寄存器的读写操作. 在单板命令行下,使用工具. 单板/usr/sbin目录下,有一系列寄存器操作相关的工具,分别介绍如下: 工具 参数 功能 备注 himd 参数1:address,必选 参数2:length,可选 从address开始,以大端方式打印length字节长度的内容. 如果没有输入length,那么默认打印256字节. himd.l 参数1:address,必

海思寄存器操作

如何查看和修改寄存器 himm address [value] 功能:把 address 对应的地址改写为 value. 如果没有输入 value,himm 会把 address 对应的值打印出来,然后提示输入新的值. himd address [length] 从 address 开始,以大端方式打印 length 字节长度的内容. 如果没有输入length, 那么默认打印256 字节. himd.l address [length] 从 address 开始,以小端方式打印 length 字

裸机寄存器操作

贴个裸机扫盲,以防哪天被花盆砸中,记忆全无.(纯水贴,,活着) //1 mode config #define ON 0x0 //2 port register define #define rGPBCON (* (volatile unsigned *) 0x56000010) // Port B control, from datasheet //3 prt init void LedInit(void) { rGPBCON = (rGPBCON & 0xfffffff0) | 0x5; /

(二)miller指导查看主控板寄存器操作

Welcome to Command Shell!Username:admin Password:***** ROS>en ROS# ROS# ROS# ROS# ROS#^ada ROS(ada)#[063-15:52:39:260]ADA CONNECTED ...,WELCOME! ROS(ada)#ROS(ada)# ROS(ada)#turnon 50 ROS(ada)#cmd 50 0 ROS(ada)#[064-15:53:15:570]------------------[065