gpt4 book ai didi

c - c中的按位运算符和移位问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:32:08 25 4
gpt4 key购买 nike

您好,我在按位运算符和移位方面遇到了一些问题。我相信 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 之前将位移动到位在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;

这会在使用 & 提取之前将感兴趣的位移动到最低位运算符(operator)。它的编写方式,左移,&总是与 0 进行比较位。

关于c - c中的按位运算符和移位问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41864691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com