首页 > 专题系列 > Java解POJ > POJ 3748 位操作 [解题报告] Java
2013
11-13

POJ 3748 位操作 [解题报告] Java

位操作

问题描述 :

假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第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

解题代码:

import java.io.BufferedInputStream;
import java.util.Scanner;

/**
 *
 *poj3748
 * 位操作
 * @author NC
 */
public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(new BufferedInputStream(System.in));
        if (scan.hasNext()) {
            String[] ss = scan.nextLine().trim().split("[,]");
            Integer r = Integer.parseInt(ss[0], 16);//按16进制解析字符串
            Integer x = Integer.parseInt(ss[1]);//默认按10进制解析
            Integer y = Integer.parseInt(ss[2]);
            r = r & ~(0x1 << x);//第x位设置成0
            r = r & ~(0x1 << (y - 2));//0
            r = r | (0x1 << (y - 1));//1
            r = r | (0x1 << y);//1
            System.out.println(Integer.toHexString(r));
        }
    }
}