尝试将NSUInteger与枚举(<<)一起使用

时间:2012-02-19 04:44:03

标签: iphone objective-c c ios

我的术语不是很好..这是我的代码:

enum {
    LoggerLogNone        = 0,
    LoggerLogMessages    = 1 << 0,
    LoggerLogErrors      = 1 << 1
};
typedef NSUInteger LoggerLogs;

我想做的是在确定是否应记录时,在我的逻辑中使用LoggerLogs。因此,在我的log:(NSString *)message中,我希望它仅在用户设置LoggerLogMessages时才能记录,而对于logError:(NSString *)error我希望它仅在用户设置LoggerLogErrors时才能记录。 我知道如何设置它们:

LoggerLogs logs = LoggerLogMessages | LoggerLogErrors;

我不知道该怎么做,检查是否选中了LoggerLogMessagesLoggerLogErrors。 任何帮助将不胜感激。我确信在某处可以回答这个问题,但由于我不知道要使用的术语,因此很难搜索&gt; _&lt;

5 个答案:

答案 0 :(得分:2)

- (void)log:(NSString *)message {
    if (logs & LoggerLogMessages) {
        NSLog(@"message: %@", message);
    }
}

- (void)logError:(NSString *)error {
    if (logs & LoggerLogErrors) {
        NSLog(@"error: %@", error);
    }
}

<<&都称为按位运算符。如果你谷歌bitwise operators C,你会发现很多解释。

答案 1 :(得分:1)

您正在寻找按位AND运算符&

if (logs & LoggerLogMessages) {
  ...
}

if (logs & LoggerLogErrors) {
  ...
}

答案 2 :(得分:1)

要检查是否设置了标志,只需执行按位AND &),并使用存储标志的变量并检查标志,结果将是如果该位序列包含在变量中,则检查该标志:

if ( (logs & LoggerLogMessages) == LoggerLogMessages ) {
    // LoggerLogMessages is set
}

或者您可能只是:

if (logs & LoggerLogMessages) { ... }

答案 3 :(得分:0)

如果要检查是否应记录消息,请使用按位AND

if(logFlags & LoggerLogMessages)
    //log the message

同样,如果要记录错误消息

if(logFlags & LoggerLogErrors)
    //log the message

此外,这些术语的常用术语是bit fieldsflags

答案 4 :(得分:0)

我认为你想要一个逻辑或按位的,比如:

if ((flag & LoggerLogMessages) || (flag & LoggerLogErrors))

另一件需要注意的事情是,你关心的两个州是唯一的两个,两者都是&gt; 0,所以

if (flag)

也会奏效。