优化C中的按位运算

时间:2013-06-27 04:26:59

标签: c bitwise-operators bit-shift

我手头有一个问题: “练习2-6。写一个函数setbits(x,p,n,y),返回x,其中n位开头 位置p设置为y的最右边的n位,而其他位保持不变。“

我已经为此编写了一个函数,如下所示。这是按预期工作的。

int func_setx(int x,int p,int n,int y)
{
    int a_t= ~0 << (p+n);
    int b_t= ~a_t >> n;
    int x_t= x& (a_t | b_t);    // a temporary x which has the bits to be changed as 0 , rest of the bits unchanged.

    int mask= (y << p) & (~(~0 << (p+n)));     // a mask which has required bits from y in positions to be set , rest all bits 0.

    printf("\nCheckpoint : mask= %x  x_t= %x\n",mask,x_t);

    int result= mask|x_t;
    return result;
}

但是我觉得逻辑很长并且可以优化,但是还不能想到任何其他方式。 有人可以建议对此进行任何优化吗?

1 个答案:

答案 0 :(得分:10)

制作n位掩码:

mask_y = (1U << n) - 1;

从位p开始:

mask_x = mask_y << p;

清除x中的相应位:

x &= ~mask_x;

y

中提取位
y &= mask_y;

将它们升级到位置p

y <<= p;

把它们放在一起:

result = x | y;

或者以更紧凑的形式:

mask = (1U << n) - 1;
result = x & ~(mask << p);
result |= (y & mask) << p;