您好,我在按位运算符和移位方面遇到了一些麻烦。我相信check_flag()
正在工作,但是set_flag()
没有。有人可以解释这是怎么回事吗?
#include <stdio.h>
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;
}
void set_flag(int* flag_holder, int flag_position)
{
*flag_holder = *flag_holder |= 1 << flag_position;
}
int check_flag(int flag_holder, int flag_position)
{
int bit = (flag_holder << flag_position) & 1;
if(bit == 0)
return 0;
else
return 1;
return bit;
}
您需要将的类型更改flag_holder
为unsigned
。假设您的int
s为32位宽,则当您设置高阶位(位置31)时,您正在设置符号位。这将导致实现定义的行为(向右移)和未定义的行为(向左移)。该set_flag()
功能应更改为:
void set_flag(unsigned* flag_holder, int flag_position)
{
*flag_holder |= (1U << flag_position);
}
在将位设置为flag_position
in之前,这会将位移动到位置flag_holder
。1U
是unsigned int
仅设置了最低位的;(1U << flag_position)
将单个设置位的flag_position
位置向左移动。的|=
运算符相当于分配逐位的结果或,的*flag_holder
和移位的位,来*flag_holder
。这也可以写成:
*flag_holder = *flag_holder | (1U << flag_position);
还有一个问题check_flag()
。移位码需要更改为:
int bit = (flag_holder >> flag_position) & 1U;
这会在与&
操作员进行提取之前将感兴趣的位移动到最低顺序的位置。左移的&
方式总是比较0
一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句