我试图设置字节的位,基于这个函数签名

int setbits(int old_value, int position, int width, int set_value)

我做错了什么,因为它总是返回0。
#include "stdafx.h"

int setbits(int old_value, int position, int width, int set_value);

int      _tmain(int argc, _TCHAR* argv[])
{
//for example turn hex 0xA (10 base 2) into ( 8 base 2)
    int old_value = 0xA;
    int position = 2;
    int width = 4;
    int set_value = 0;

    printf("setbits, old_value %x, position %i, width %i, set_value %x, output %x",old_value,7,width,set_value,0);
    getchar();
}

//position - is the least significant bit of the old_value you wish to change
//old_value - is the value before you start changing it
//width - is the width in bits of the value you want to change (old_value width).
//set_value - is the value you want to use to modify the bits
int setbits(int old_value, int position, int width, int set_value)
{
    int mask = 0x1;
    int return_val = 0x0;

    if (0 < position <= width)
    {
        //initialize mask
        int c=0;
        for (c; c<width ; c++)
        {
        mask = mask << 1;
        }

        printf("ini mask %x \n",mask);

        //shift into position the set_value (aka state)
        mask = mask >> position;

        printf("shifted mask %x \n",mask);
        //if state is 1
        if (set_value)
        {
            return_val = mask |  old_value;
        }
        else
        {
            return_val = (~mask) & old_value;
        }
    }
    else
    {
        printf("setbits(), position is out of range, position : %x, width : %x", position, width);
    }
    return return_val;
}

最佳答案

更正代码

int setbits(int old_value, int position, int width, int set_value)
{
    int mask = 0x1;
    int return_val = 0x0;

    if ((0 < position) && (position <= width) )
    {
        //initialize mask
        mask = mask << width;

        printf("ini mask 0x%02X \n",mask);

        //shift into position the set_value (aka state)
        mask = mask >> position;

        printf("shifted mask 0x%02X \n",mask);

        //if state is 1
        if (set_value)
        {
            return_val = mask |  old_value;
        }
        else
        {
            return_val = (~mask) & old_value;
        }

        printf("returned value: 0x%02X\n", return_val);
    }
    else
    {
        printf("setbits(), position is out of range, position : %x, width : %x", position, width);
    }
    return return_val;
}

通过您的示例,您将得到输出:
ini mask 0x10
shifted mask 0x04
returned value: 0x0A

这正是我们所期望的。
value --> 0x0A --> 0b00001010
mask  --> 0x04 --> 0b00000100

~mask --> 0xFB--> 0b11111011

value & ~mask = 0x0A

关于c - 在C中设置一个字节的位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35264105/

10-11 22:57
查看更多