所以这是我上一篇文章的更新,但我仍然很难理解这是如何工作的。所以我给出了主要功能:
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。
答案 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);
}
将它与主程序一起运行,您将获得所需的输出。