c - K&R C 反转功能

标签 c bit-manipulation bit bitmask operations

练习 2-7。编写一个函数 invert(x,p,n),返回 x,其中从位置 p 开始的 n 位反转(即 1 变为 0,反之亦然),其他不变。

#include <cstdio>

int invert(unsigned int x, int p, int n)
{
    int inverted_x = ~x;
    //gets rid of bits before position p
    inverted_x = inverted_x << (p - 1);
    inverted_x = inverted_x >> (p - 1);

    //gets rids of bits after position p+n
    inverted_x = inverted_x >> ((sizeof(x) * 8) - (p + n));
    inverted_x = inverted_x << ((sizeof(x) * 8) - (p + n));
    return inverted_x;

}

int main()
{
    int a = 123;
    printf("%d \n", invert(a, 2, 3));
}

我做错了什么?

最佳答案

在我看来,按以下方式编写函数要简单得多。 我认为位置是从0开始的。

int invert( int x, int p, int n )
{
    unsigned int mask = ~( ~0 << n ) << p;

    return x ^ mask;;
}    

至于你的函数,至少有这些语句

//gets rid of bits before position p
inverted_x = inverted_x << (p - 1);
inverted_x = inverted_x >> (p - 1);

已经错了。他们不会按照你的想法做。

这样写才是正确的

//gets rid of bits before position p
inverted_x = inverted_x >> p;
inverted_x = inverted_x << p;

尽管如此,执行此操作没有意义,因为原始数字的低位会丢失

关于c - K&R C 反转功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34103176/

相关文章:

c - 如何确保两个地址的最低有效 4 位相同?

c - ino_t 的占位符

c - 表中的最小值和最大值

c++ - #ifdef 指令末尾的额外标记

C - 有什么方法可以使用位检查来检查数字是否等于 1?

java - 比较两个十六进制字符串以查找匹配位数

c - 设置为 0.1 的 float 将 false 与 0.1 进行比较

language-agnostic - 使用按位运算符检查整数是否为 2^1-2^j 形式的单行代码

c - 需要帮助解释 wiss 代码中使用/和 % 的位操作

c - 在 C 中使用未声明的标识符 'a'