【问题标题】:instantiating bitset using hex character使用十六进制字符实例化位集
【发布时间】:2010-05-12 04:26:19
【问题描述】:

嘿,我正试图弄清楚如何基于十六进制字符实例化一个 4 位位集。例如,如果我有一个值为“F”的字符,我想创建一个大小为 4 的位集,初始化为 1111,或者如果它是 A,我想将其初始化为 1010。我可以使用一堆这样的 if 语句:

fn(char c)
{
  bitset<4> temp;

  if(c == 'F')
    temp.set();

  //...

  if(c == '9')
  {
    temp.set(1);
    temp.set(3);
  }

  //...

}

这效率不高,有没有一种方法可以轻松地将字符串转换为十进制整数并使用 int 的最后 4 位构造位集?

感谢您的帮助。

【问题讨论】:

    标签: c++ hex bitset


    【解决方案1】:

    该类型具有接受unsigned longa constructor。将你的角色转换为相应的整数值,并用它构造一个bitset

    std::bitset<4> temp(hexchar_to_int(c));
    

    您可以根据需要实现假设的hexchar_to_int。您可以为此使用strtoul。例如:

    unsigned long hexchar_to_int(char c) {
      char chars[2] = {c, '\0'};
      return strtoul(chars, NULL, 16);
    }
    

    【讨论】:

    • 我看到的hexchar_to_int 的一个常见技巧是声明一个字符串"0123456789ABCDEF" 并执行indexOf
    • 聪明。但是,您不只是需要另一个技巧来处理indexOf 吗?
    • 不是真的,那只是一个std::find(begin, end, X)-begin。但是,当有人用 f 调用它时,它会非常糟糕。
    • 当然。我想我的意思是,如果它的描述是指调用一个甚至不存在的函数,它看起来并不像一个“技巧”。 (但调用一个不存在的函数是个绝招!)
    【解决方案2】:

    如前所述,您需要为构造函数提供long。你怎么知道的?设置查找数组:

    const int BASE = MIN('0', MIN('a', 'A')); // std::min isn't an ICE
    const int SIZE = MAX('9', MAX('f', 'F')) - BASE;
    long lookup[SIZE];
    lookup['0' - BASE] = 0; lookup['1' - BASE] = 1;
    lookup['2' - BASE] = 2; lookup['3' - BASE] = 3;
    lookup['4' - BASE] = 4; lookup['5' - BASE] = 5;
    lookup['6' - BASE] = 6; lookup['7' - BASE] = 7;
    lookup['8' - BASE] = 8; lookup['9' - BASE] = 9;
    lookup['A' - BASE] = 10; lookup['a' - BASE] = 10;
    lookup['B' - BASE] = 11; lookup['b' - BASE] = 11;
    lookup['C' - BASE] = 12; lookup['c' - BASE] = 12;
    lookup['D' - BASE] = 13; lookup['d' - BASE] = 13;
    lookup['E' - BASE] = 14; lookup['e' - BASE] = 14;
    lookup['F' - BASE] = 15; lookup['f' - BASE] = 15;
    // ...
    inline std::bitset<4> BitsFromChar(char c) {
      return lookup[c-BASE];
    }
    

    【讨论】:

      【解决方案3】:

      std::bitset 有一个接受unsigned long 的构造函数。你可以使用它:

      void fn( char c ) {
          if ( c >= '0' && c <= '9' ) {
            bitset<4> temp( c - '0' );
            ...
          }
          if ( c >= 'A' && c <= 'F' ) {
            bitset<4> temp( c - 'A' + 0xA );
            ...
          }
          if ( c >= 'a' && c <= 'f' ) {
            bitset<4> temp( c - 'a' + 0xA );
            ...
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        试试这个函数来转换一个十六进制字符(处理大写和小写)。然后,将结果传递给bitset 构造函数。您必须先检查输入是否有效!

        int HexLetterToInt(char input) 
        { 
            if(input >= '0' && input <= '9') 
            { 
                input -= '0'; 
            } 
            else if(input >= 'A' && input <= 'F') 
            { 
                input -= 'A' - 10;
            } 
            else if(input >= 'a' && input <= 'f') 
            { 
                input -= 'a' - 10;
            } 
            else 
            { 
                // Not a valid character
                input = -1;
            } 
            return input; 
        }
        

        【讨论】:

          【解决方案5】:

          另一种方式..

          void fn(char c)
          {
              unsigned int hexValue = 0;
              char str[2] = {c, '\0'};
              sscanf(&str, "%X", &hexValue);
              bitset<4> temp(hexValue);
          }
          

          【讨论】:

          • @Rob 谢谢。更正了问题。
          猜你喜欢
          • 2018-01-31
          • 2010-10-04
          • 2021-06-27
          • 1970-01-01
          • 2019-07-27
          • 2017-07-30
          • 2017-04-05
          • 2018-05-17
          • 1970-01-01
          相关资源
          最近更新 更多