1

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

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。当第 n 位为 0 时,“check_flag”函数返回一个整数,当它为 1 时返回 1 .我不明白“set_flag”到底在做什么,以及3、16和31如何被保存为“flags”,然后在“check_flag”中返回为1。

4

2 回答 2

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);
}

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

于 2017-09-18T15:33:30.820 回答
0

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

您可以使用包含 OR 运算符“|”轻松将一位或多位设置为“1”

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

main value  01011000 | 
mask        00000001 = 
result      01011001

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

例如:我们要测试位#3

main value  01011000 & 
mask        00001000 = 
result      00001000

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

所以这里有两个函数 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 << flag_position;” 构建这个单个位掩码,它基本上将 bit#0 设置为“1”,然后向左移动到我们要设置/检查的 #bit。

于 2016-10-08T04:59:29.117 回答