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

发布于 2024-12-25 10:37:27 字数 238 浏览 3 评论 0原文

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

func(param1|param2|param3)

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

func(param1, ...)

我正在尝试在 C++ 中执行此操作,并且我正在考虑将函数的参数作为枚举中的值。

我该如何解决这个问题?

I was wondering how to do this:

func(param1|param2|param3)

and then extract those values in the function, I have seen this in multiple functions, or is it better to do this:

func(param1, ...)

?

I am trying to do this in C++, and I was thinking of having the parameters to the function as values in a enum.

How do I solve this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

寄风 2025-01-01 10:37:27

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.

Param1, param2, param3 are usually defined as a numbers with different bits turned on.
| is an operator of bitwise alternative, that means it works on separate bits.

In example:

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

When you pass an argument to function you make a bitwise alternative of earlier defined params.
In function, you don't make a decomposition, but check if a specified bit is set on, using bitwise conjunction:

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.
清秋悲枫 2025-01-01 10:37:27

假设您有独立位(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 的三位音量级别)。

Assuming you have the values as independent bits (powers of two) like:

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

(or the equivalent enums or const int values, depending on how you want to do them - I've used #define simply because it's what I'm used to), you can pass them as:

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

Then you extract them with something like:

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

For single-bit specifiers, you can get away with the if (bitmask & IS_ON) form but you need the full check if your specifiers may be multi-bit values (like a three-bit volume level of 0 through 7, for example).

肥爪爪 2025-01-01 10:37:27

这是一个关于如何使用任意按钮类型创建“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;
}

This is an useful example to how create "MessageBox" function with arbitrary button types :

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文