函数参数中的按位或(|)

时间:2012-01-08 13:42:39

标签: c++ c bit-manipulation

我想知道如何做到这一点:

func(param1|param2|param3)

然后在函数中提取这些值,我已经在多个函数中看到了这个值,或者这样做更好:

func(param1, ...)

我试图用C ++做这个,我想把函数的参数作为枚举中的值。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:17)

Param1,param2,param3通常定义为打开不同位的数字。 |是按位替换的运算符,这意味着它适用于单独的位。

例如:

const int param1 = 0x01;
const int param2 = 0x02;
const int param3 = 0x04;

当你将一个参数传递给函数时,你可以选择先前定义的参数。 在函数中,您不进行分解,而是使用按位连接检查是否设置了指定位:

void func(int arg){
  if(arg & param1)
    // do something
  if(arg & param2)
    // do something else
    // ...
}

func(param1 | param3); 
// "do something" will be done,
// but "do something else" not.

答案 1 :(得分:13)

假设您将值作为独立位(2的幂),如:

#define IS_ON    0x01
#define IS_LARGE 0x02
#define IS_RED   0x04

(或等效的enumsconst int值,具体取决于您的操作方式 - 我使用#define只是因为它是我习惯的,)你可以传递它们:

funcname (IS_ON | IS_RED);   // passes in 0x05

然后你用以下内容提取

void funcname (int bitmask) {
    if ((bitmask & IS_ON) == IS_ON) { // 0x05 & 0x01 -> 0x01
        // IS_ON bit is set.
    }
    :
}

对于单比特说明符,您可以使用if (bitmask & IS_ON)表单,但是如果您的说明符可能是多位值(如0到7的三位音量级别,则需要全面检查)例子)。

答案 2 :(得分:0)

这是如何使用任意按钮类型创建“MessageBox”函数的一个有用示例:

enum Button
{
    OK =      0x0001,
    CANCEL =  0x0010,
    YES =     0x0100,
    NO =      0x1000
};

void messagebox(char *text, int button)
{
    char msg[256];
    strcpy(msg, text);

    if ((button & Button::OK) == Button::OK)
        strcat(msg, " [OK]");
    if ((button & Button::CANCEL) == Button::CANCEL)
        strcat(msg, " [Cancel]");
    if ((button & Button::YES) == Button::YES)
        strcat(msg, " [Yes]");
    if ((button & Button::NO) == Button::NO)
        strcat(msg, " [No]");

    cout << msg << endl;
}

int main()
{
    messagebox("salam", Button::OK | Button::CANCEL);
    return 0;
}