zoukankan      html  css  js  c++  java
  • 【原】 POJ 3748 位操作 解题报告

    http://poj.org/problem?id=3748

    方法:

    给定16进制32bit数,将其第x位置0,第y位开始的三位置成110
    注意考虑待置位数中有a~f的情况

    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

       1: #include <iostream>
       2: #include <fstream>
       3: #include <string>
       4:  
       5: using namespace std ;
       6:  
       7: //A~F : 10~15
       8: int alpArrUp[6]={10,11,12,13,14,15} ;
       9: //a~f : 10~15
      10: int alpArrLow[6]={10,11,12,13,14,15} ;
      11:  
      12: void run3748()
      13: {
      14:     ifstream in("in.txt") ;
      15:  
      16:     string str ;
      17:     string numStr,xStr,yStr ;
      18:     string num16 ;
      19:     unsigned num,x,y,tmp1,tmp0,tmpnum ;
      20:     string::size_type pos1,pos2 ;
      21:     int i,j ;
      22:     int len ;
      23:  
      24:     in>>str ;
      25:     pos1 = str.find_first_of(',') ;
      26:     pos2 = str.find_last_of(',') ;
      27:  
      28:     //从字符串中取得待置位的数、x、y
      29:     numStr = str.substr(0,pos1) ;
      30:     xStr = str.substr(pos1+1,pos2-pos1-1);
      31:     yStr = str.substr(pos2+1);
      32:  
      33:     //将字符串转化成16进制数
      34:     //需要注意字符串的0位在左,数字的0位在右,转换时容易出错
      35:     num = 0 ;
      36:     len = numStr.size() ;
      37:     for( i=len-1,j=0 ; i>=0 ; --i,++j )
      38:     {
      39:         if( numStr[i]>='a' && numStr[i]<='f' )
      40:             num += ( alpArrLow[numStr[i]-'a']<<(4*j) ) ;
      41:         else if( numStr[i]>='A' && numStr[i]<='F' )
      42:             num += ( alpArrUp[numStr[i]-'a']<<(4*j) ) ;
      43:         else
      44:             num += ( (numStr[i]-'0')<<(4*j) ) ;
      45:     }
      46:  
      47:     //将x转成数字
      48:     len = xStr.size();
      49:     if(len==1)
      50:         x = xStr[0]-'0' ;
      51:     else if(len==2)
      52:         x = (xStr[1]-'0')+(xStr[0]-'0')*10 ;
      53:  
      54:     //将y转成数字
      55:     len = yStr.size();
      56:     if(len==1)
      57:         y = yStr[0]-'0' ;
      58:     else if(len==2)
      59:         y = (yStr[1]-'0')+(yStr[0]-'0')*10 ;
      60:  
      61:     //置位
      62:     tmp1 = 0xffffffff ;
      63:     tmp0 = 0x00000000 ;
      64:  
      65:     //对第x位置0
      66:     //即将num的第x位“与”0,在做“与”时若保证其他位不变,则需要“与”1
      67:     num &= (tmp1 ^ (1<<x) ) ;
      68:  
      69:     //对第y、y-1位置1
      70:     num |= (tmp0 ^ (3<<(y-1)) ) ;
      71:     //对第y-2位置0
      72:     num &= (tmp1 ^ (1<<(y-2)) ) ;
      73:  
      74:     //输出16进制表示用std::hex
      75:     cout<<std::hex<<num<<endl;
      76: }

    如果您满意我的博客,请点击“订阅Allen Sun的技术博客”即可订阅,谢谢:)

    原创文章属于Allen Sun
    欢迎转载,但请注明文章作者Allen Sun和链接
  • 相关阅读:
    采用闭锁(CountDownLatch)控制线程的先后顺序(一)
    采用java信号量(semaphore)让线程轮流打印
    生产者消费者模式的java实现(实现四)
    生产者消费者模式的java实现(实现三)
    生产者消费者模式的java实现(实现二)
    生产者消费者模式的java实现(实现一)
    求最大子串和 最长子串的java写法
    Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process 异常处理
    定时任务服务器不定时重启原因解析
    centos 6.3 + gerrit-2.8.6 + repo 实践
  • 原文地址:https://www.cnblogs.com/allensun/p/1873013.html
Copyright © 2011-2022 走看看