首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >K&R练习2-7,优化?

K&R练习2-7,优化?
EN

Stack Overflow用户
提问于 2014-12-26 10:43:17
回答 2查看 308关注 0票数 3

目前,我正在使用K&R中的“C编程语言”学习C。我解决了练习2-7,它说:

编写一个函数invert(x,p,n),返回以n位开头的p位(即1改为0,反之亦然)的n位,其他位不变。

这是我的代码(我在这里自愿使用字符):

代码语言:javascript
运行
复制
#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循环中,它会产生许多n 1位吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-26 10:54:35

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

例如:

代码语言:javascript
运行
复制
2 ^ 3 - 1 = 7  => 111
2 ^ 5 - 1 = 31 => 11111

在您的例子中,您可以取消for循环来构造这个数字,只需简单地说:

代码语言:javascript
运行
复制
bitsToConvert = (1<<n) - 1;

别忘了处理极端的情况。

票数 2
EN

Stack Overflow用户

发布于 2014-12-26 11:17:29

Thrustmaster所说的不需要指定任何"n“的替代方法是按位使用,而不是对空值使用。

代码语言:javascript
运行
复制
variable = ~(variable ^ variable);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27656021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档