按位组合作为比较工具

时间:2014-11-13 23:11:52

标签: if-statement bit-manipulation

我正在编写一个具有打印标志的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?

3 个答案:

答案 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的值,因此如果您想稍后再次使用它,请复制它。