微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决写一个 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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。