使用给定的移位更改数字中的 4 位

Changing 4 bits in a number with a given shift

我有一个十进制数,我需要用给定的移位操作 4 位。 例如,如果数字是 208,即二进制 11010000,我想将 4 位更改为 1101,移动 2。新数字将是 244。 当变化是:11110100。 这是我的代码:

void change_bit(int num, int bit, int shift)
{
    num = (num & (0xfffffff0<<shift)) | (bit << shift);
    printf("%d\n", num);
}

0xfffffff0 的移动只是在左边的大小上增加了'0'。 我该如何解决?

如果将复杂的表达式拆分成更小的部分,会更容易。它不会影响代码的效率,但会更容易阅读和理解。

unsigned change_bit(unsigned num, unsigned bit, int shift)
{
    unsigned mask = ((1U << 4) - 1) << shift;  // mask to reset the bits at the position

    num &= ~mask;  //reset the bits
    num |= bit << shift;  //set the bits
    return num;
}

或更普遍

unsigned change_bit(unsigned num, unsigned newval, int shift, int numbits)
{
    unsigned mask = ((1 << numbits) - 1) << shift;

    num &= ~mask;
    num |= newval << shift;
    return num;
}

和一些测试代码:

void print(unsigned val)
{
    for(unsigned x = 1U << 31; x ; x >>= 1)
    {
        printf("%d", !!(val & x));
    }
    printf("\n");
}

int main(void)
{
    print(208);
    print(change_bit(208, 0b1101, 2));
    printf("%d\n", change_bit(208, 0b1101, 2));
}

您还应该添加一些参数检查。