C中的按位运算符和移位问题

约翰

您好,我在按位运算符和移位方面遇到了一些麻烦。我相信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_holderunsigned假设您的ints为32位宽,则当您设置高阶位(位置31)时,您正在设置符号位。这将导致实现定义的行为(向右移)和未定义的行为(向左移)。set_flag()功能应更改为:

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

在将位设置为flag_positionin之前,这会将位移动到位置flag_holder1Uunsigned 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中的带符号字节类型和按位运算符?

来自分类Dev

hashCode中按位运算符>>>

来自分类Dev

按位'&'运算符

来自分类Dev

重载类函数中的按位And(&)运算符和“ * this”

来自分类Dev

C中的移位运算符优先级

来自分类Dev

为什么按位运算符没有逻辑“和/或”运算符那么聪明

来自分类Dev

移位和取消引用运算符出现问题

来自分类Dev

如何在C中评估移位运算符?

来自分类Dev

PHP按位运算符的问题-转换为Coldfusion

来自分类Dev

Java中的按位和运算符

来自分类Dev

按位和运算符如何在javascript中的对象上工作?

来自分类Dev

用按位和运算符分配值

来自分类Dev

c中按位OR运算符的结果

来自分类Dev

如何使用按位运算符和位操作在C中交换2个整数?

来自分类Dev

在C语言(也是C ++)中,“&”运算符如何同时用作地址运算符和按位运算符?由于C不支持运算符重载

来自分类Dev

Gremlin中的按位运算符

来自分类Dev

PHP中的按位运算符

来自分类Dev

按位运算符和位操作

来自分类Dev

C按位运算符

来自分类Dev

使用按位和运算符c ++

来自分类Dev

按位运算符和for循环

来自分类Dev

具有按位运算符的C ++中的算法

来自分类Dev

C ++'>'按位运算符

来自分类Dev

C按位运算符示例

来自分类Dev

.NET Framework方法中的按位和运算符

来自分类Dev

组合按位和与补运算符

来自分类Dev

如何在C中按位运算存储移位的位?

来自分类Dev

按位逻辑运算符和移位运算符

来自分类Dev

按位或运算符