问题:
假设在一个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进制输出)。例如:
n Sample Input
12345678,0,3
输出:
1234567c
代码:
#include <stdio.h>
#include <stdlib.h>
void f(int r, int x, int y);
int main(int argc, char *argv[])
{
// f(0x12345678, 0, 3);
int r;
int x, y;
scanf("%x%d%d", &r, &x, &y);
f(r, x, y);
return 0;
}
void f(int r, int x, int y)
{
if (x >31 || x < 0)
return ;
//将r的x位设置为0,其余不变
unsigned int op = 0xFFFFFFFE;
for (short i = 0; i != x; ++i) {
op = (op << 1);
op = op | 0x00000001;
}
//得到了一个第x位为0的掩码
r = r & op;
//将r的y位左起3位(从高到低)设置为110
op = 0xFFFFFFFE;
for (int i = 0; i != y; ++i) {
op = (op << 1);
op = op | 0x00000001;
}
r = r & op;
op = 0x00000003;
for (int i = 0; i != y-1; ++i) {
op = (op << 1);
}
//得到了第y、y+1位为11,其余全0的掩码
r = r | op;
printf("%x\n", r);
}