转贴 c程序设计大赛

来源:互联网 发布:js中的value 编辑:程序博客网 时间:2024/05/17 03:46

Problem A: 位操作

Description

假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第Y位开始的连续三位设置成110(从高位到低位的顺序),而其他位保持不变。对给定的寄存器值R,及X,Y,编程计算更改后的寄存器值R。

Input

仅一行,包括R,X,Y,以逗号","分隔,R为16进制表示的32位整数,X,Y在0-31之间且Y>=3,(Y-X)的绝对值>=3,保证两次置位不会重合

Output

更改后的寄存器值R(16进制输出)

Sample Input

12345678,0,3

Sample Output

1234567c

解题思路:

很简单的位操作,但是需要注意的是Y那里是 110,不能直接或上110,而是先两次SET,在CLR。dave就在这里浪费了有1个小时,惭愧

code

Code:
  1. #include <stdio.h>  
  2.   
  3. #define CLR(r, x)   r &= ~(1UL << x)  
  4. #define SET(r, y)   r |=  (1UL << y)  
  5.   
  6. int main()  
  7. {  
  8.     int r, x, y;  
  9.     scanf("%x,%d,%d", &r, &x, &y);  
  10.   
  11.     CLR(r,x);  
  12.     SET(r,y);  
  13.     SET(r,y-1);  
  14.     CLR(r,y-2);  
  15.   
  16.     printf("%x", r);  
  17.     return 0;  

原创粉丝点击