我正在编写一个具有打印标志的C++
函数。我想使用此标志打印不同的消息。我想到这个标志取三个不同的二进制值,并根据其值打印不同的消息。
flag == 000
printf "flag is 0"
flag == 010
printf "flag is 1"
flag == 100
printf "flag is 2"
如何比较此标志的值,以便我可以得到以下输出:
flag ==011
printf "flag is 0"
printf "flag is 1"
flag ==101
printf "flag is 0"
printf "flag is 2"
flag ==111
printf "flag is 0"
printf "flag is 1"
printf "flag is 2"
我知道我可以添加更多if-blocks
来执行此任务,这看起来并不专业。有人可以帮我找到正确的方法,避免写不必要的if-block
s?
答案 0 :(得分:1)
您可以遍历并对&
中的每个位执行按位和(flags
)。这意味着如果要检查更多位,则不必添加更多if / else块。 e.g:
#include <stdio.h>
int main() {
int flags = 7;
int n = 3; // change this to however many bits you want to check
for (int i=0; i<n; ++i) {
if (flags & 1<<i) {
printf("flag is %d\n", i);
}
}
}
答案 1 :(得分:1)
可能是这样的:
char flags[] = { 0x01, 0x02, 0x04, 0x08 };
int i;
for(i = 0 ; i < sizeof(flags) ; i++ )
if(flag & flags[i])
printf("flag is %i\n",i + 1);
答案 2 :(得分:1)
基本上你想打印出标志中设置的位。要做到这一点,你可以使用循环和右移。
for(int bit = 0; flag > 0; ++bit, flag >>= 1) {
if(flag & 1)
printf("flag is %d\n", bit);
}
请注意,这会破坏flag
的值,因此如果您想稍后再次使用它,请复制它。