位操作十六进制C ++

时间:2013-05-16 17:47:04

标签: c++ hex bit-manipulation

我有一个unsigned int和一个十六进制值。我希望能够检查unsigned int是否包含十六进制值;例如:

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

现在我的unsigned int是这三个错误代码的组合。这些错误代码中的每一个都有一个唯一的字符串,并且根据我的变量原因中存在哪一个我需要生成字符串。

5 个答案:

答案 0 :(得分: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...    
}

答案 1 :(得分: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
 }

答案 2 :(得分:0)

您很可能正在寻找bitwise-AND

C++ info here

答案 3 :(得分:0)

像这样:

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

您可以通过手动和操作看到它的工作原理:

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

答案 4 :(得分:0)

我不确定我的问题是否正确,但看起来可以查看&操作

e.g。

((reason & MAJOR_ERROR_CODE) != 0)
{

//Do what you want to do for MAJOR_ERROR_CODE

}

((reason & MAJOR_ERROR_CODE) != 0) { //Do what you want to do for MAJOR_ERROR_CODE }