按位运算和设置“标志”

时间:2016-10-08 02:48:06

标签: bit-manipulation bitwise-operators bit-shift bitwise-and bitwise-or

所以这是我上一篇文章的更新,但我仍然很难理解这是如何工作的。所以我给出了主要功能:

void set_flag(int* flag_holder, int flag_position);
int check_flag(int flag_holder, int flag_position);

int main(int argc, char* argv[])
{
    int flag_holder = 0;
    int i;
    set_flag(&flag_holder, 3);
    set_flag(&flag_holder, 16);
    set_flag(&flag_holder, 31);
    for(i = 31; i >= 0; i--) {
        printf("%d", check_flag(flag_holder, i));
        if(i % 4 == 0)
            printf(" ");
    }
    printf("\n");
    return 0;
}

对于赋值,我们应该编写函数set_flag和check_flag,以便输出等于:

1000 0000 0000 0001 0000 0000 0000 1000

所以根据我的理解,应该使用“set_flag”函数来确保第n位为1.并且“check_flag”函数返回第n位为0时为0的整数,以及1时为它是1.我不明白“set_flag”究竟在做什么,以及3,16和31将如何保存为“flags”,然后在“check_flag”中返回为1。

2 个答案:

答案 0 :(得分:0)

使用二进制或十六进制值时,常见的方法是定义一个我们将应用于主值的掩码。

您可以使用包含OR运算符“|”

轻松地将一个或多个位设置为“1”

例如:我们想将#0位设置为'1'

main value  01011000 | 
mask        00000001 = 
result      01011001

要测试特定位,您可以使用AND运算符'&'

例如:我们想测试第3位

main value  01011000 & 
mask        00001000 = 
result      00001000

注意:您可能需要正确格式化结果;在这里&操作将返回零或非零(但也不必为'1')。

所以这里有2个函数set_flag和check_flag:

void set_flag(int* flag_holder, int flag_position) {
    int mask =  1 << flag_position;  
    flag_holder = flag_holder | mask;
}

int check_flag(int flag_holder, int flag_position) {
    int mask =  1 << flag_position;
    int check = flag_holder & mask;  
    return (check !=0 ? 1 : 0);
}

在这些场景中,我们需要一个二进制掩码来设置/检查一个位。代码“int mask = 1&lt;&lt; flag_position;”构建这个单位掩码,它基本上将位#0设置为'1',然后向左移动到我们想要设置/检查的#bit。

答案 1 :(得分:0)

功能Set_flag和功能Check_flag:

void set_flag(int* flag_holder, int flag_position) {
    int mask =  1 << flag_position;  
    *flag_holder = *flag_holder | mask;
}

int check_flag(int flag_holder, int flag_position) {
    int mask =  1 << flag_position;
    int check = flag_holder & mask;  

   return (check !=0 ? 1 : 0);
}

将它与主程序一起运行,您将获得所需的输出。