2013-05-16 3 views
2

У меня есть unsigned int и шестнадцатеричное значение. Я хочу, чтобы проверить, не содержит ли unsigned int шестнадцатеричное значение; например:Бит-манипуляция Hexadecimal C++

unsigned int reason = 0x80020002 

#define MAJOR_ERROR_CODE 0x00020000 
#define MINOR_ERROR_CODE 0x00000002 
#define OPTIONAL_ERROR_CODE 0x80000000 

Теперь, как мы видим, переменная имеет все три кода ошибки #define. Мне нужно определить наличие/отсутствие шестнадцатеричных кодов ошибок в переменной. Как мне это сделать?

Редактировать 1: Извините, все, наверное, я задал несколько другой вопрос, когда я попытался упростить его и опубликовать. То, что у меня есть пара крупных, малых и факультативных кодов ошибок - например, для

#define MAJOR_ERROR_CODE_1 0x00020000 
#define MAJOR_ERROR_CODE_2 0x00010000 
#define MAJOR_ERROR_CODE_3 0x00070000 

#define MINOR_ERROR_CODE_1 0x00000002 
#define MINOR_ERROR_CODE_2 0x00000004 
#define MINOR_ERROR_CODE_3 0x00000006 

#define OPTIONAL_ERROR_CODE_1 0x80000000 
#define OPTIONAL_ERROR_CODE_2 0x50000000 
#define OPTIONAL_ERROR_CODE_3 0x30000000 

Теперь моя беззнаковое целочисленное значение представляет собой сочетание этих трех кодов ошибок. Каждый из этих кодов ошибок имеет уникальную строку и в зависимости от того, какая из них присутствует в моей переменной, мне нужно создать строку.

+0

У вас есть 3 ошибки (мажор, минор, опционально) зачем вам весь Int (предполагая, что 32 бита) для хранения этих троих? Почему бы просто не использовать uint8_t и выбрать три бита, и если они установлены, у вас есть ошибки, если они нет, у вас нет ошибок? Вы можете проверить отдельные ошибки или комбинацию всех или всех трех. –

ответ

2

Если эти коды один бит, это так просто, как

if ((reason & MAJOR_ERROR_CODE) != 0) 
{ 
    // this is a major error 
} 

Однако я подозреваю, что это на самом деле маска, например,

#define MAJOR_ERROR_MASK 0x7fff0000 
if ((reason & MAJOR_ERROR_MASK) == MAJOR_ERROR_CODE) 
{ 
     // this is a major error 
} 
+0

Привет, спасибо. Это работает. Можете ли вы объяснить мне или указать мне ресурсы, которые позволят вам узнать, как использовать маски. В вашем примере я не понимаю, почему вы использовали маску 0x7fff0000. Я просто использовал маску 0x000f0000 для основного кода ошибки, где установлена ​​четвертая цифра слева, и она работала нормально. –

+1

@EternalLearner Подумайте, как работает побитовое 'AND'. Другой ответ включает ссылку на некоторые ресурсы, которые вы можете использовать, но вы можете счесть полезным экспериментировать. Сначала прочитайте статью [Wikipedia] (https://en.wikipedia.org/wiki/Bitwise_operation#AND), а затем напишите небольшую программу, которая будет выполнять побитовые операции для вас, отображая их фактический результат. Попробуйте сделать некоторые примеры на бумаге, сравните свои результаты с программой, которую вы написали. Например, '(0x0030 & 0x00F0)' возвращает true (поскольку 3 = 0011 и F = 1111 -> 0011 и 1111 = 0011, и это не равно нулю.) –

+0

Спасибо Nik Bougalis –

3

Используя бинарный оператор &:

if(reason & MAJOR_ERROR_CODE) 
{ 
    // Do Major Error code...  
} 

if(reason & MINOR_ERROR_CODE) 
{ 
    // Do minor Error code...  
} 

if(reason & OPTIONAL_ERROR_CODE) 
{ 
    // Do Optional error code...  
} 
0

Что-то вроде так:

const bool isErrorCodeSet = reason & MAJOR_ERROR_CODE; 
//...and so on 

Вы можете увидеть, что это работает в основном вручную и эксплуатации:

80020002 
& 00020000 
------------ 
    00010000 
0

Я не уверен, если у меня вопрос правильный, но выглядит как можно проверить с помощью & операции

например.

((reason & MAJOR_ERROR_CODE) != 0) 
{ 

//Do what you want to do for MAJOR_ERROR_CODE 

}