我正在用K&R的“C编程语言”学习C。我解决了练习2-7,它说:
编写一个函数invert(x,p,n)返回x,其中n位开始于位置p倒转(即1变为0,反之亦然),其他位保持不变。
这是我的代码(我自愿使用这里的字符):

#include <stdio.h>

#define NUMBER   235
#define POSITION 2
#define AMOUNT   4

unsigned invert(unsigned char x, char p, char n)
{
    unsigned char bitsToInvert = 0, i;

    for (i = 1; i < n; i++) { // Make a number n-bits width, full of 1
        bitsToInvert |= 1;
        bitsToInvert <<= 1;
    }
    bitsToInvert |= 1;

    bitsToInvert <<= p;

    x ^= bitsToInvert;

    return x;
}

int main()
{
    printf("%d\n", invert(NUMBER, POSITION, AMOUNT));
}

我能给代码带来什么优化吗尤其是在for循环上,它创建了一个n1位的数目?
谢谢!

最佳答案

2^n - 1始终是一个设置了所有nLSB位的数字。
例如:

2 ^ 3 - 1 = 7  => 111
2 ^ 5 - 1 = 31 => 11111

在您的例子中,您可以通过简单地说:
bitsToConvert = (1<<n) - 1;

别忘了处理极端情况。

关于c - K&R练习2-7,优化吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27656021/

10-10 10:07