写一个 func invert(x,p,n) 返回 x,其中从位置 p 开始的 n 位被反转1 变为 0,反之亦然,其他保持不变

问题描述

以下问题的答案是否正确?

我的解决方案是:

#include <stdio.h>

unsigned invert(unsigned x,int p,int n)
{
    return (x >> (p + 1 - n)) ^ ~(~0 << n);
}

int main()
{ 
    printf("%d\n",invert(6,4,3));
    return 0;
}

打印输出 60110 的二进制等价物。

解决方法

不,这是不正确的。

x >> (p+1-n) 会将原始数字的所有位移位,以便最高有效位不能保持不变。

我会使用类似以下内容

unsigned invert(unsigned x,int p,int n)
{
    int const n_bits = sizeof(x) * CHAR_BIT;
    assert(p >= 0  &&  p < n_bits);
    assert(n >= 0  &&  n + p <= n_bits);
    if ( n == 0 )
        return x;
    unsigned const mask = (~0u >> (n_bits - n)) << p;

    return x ^ mask;
}