Создание набора битов с использованием шестнадцатеричного символа
Эй, я пытаюсь выяснить, как создать 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);
}
//...
}
Это не эффективно, есть ли способ легко преобразовать строку в десятичное целое число и построить набор битов, используя последние 4 бита типа int?
Спасибо за любую помощь.
5 ответов
Этот тип имеет конструктор, который принимает unsigned long
, Преобразуйте вашего персонажа в соответствующее интегральное значение и создайте 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);
}
Как уже отмечалось, вам нужно 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];
}
Попробуйте эту функцию для преобразования шестнадцатеричного символа (обрабатывает как прописные, так и строчные буквы). Затем передайте результат 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;
}
Еще один способ..
void fn(char c)
{
unsigned int hexValue = 0;
char str[2] = {c, '\0'};
sscanf(&str, "%X", &hexValue);
bitset<4> temp(hexValue);
}
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 );
...
}
}