目前,我正在使用K&R中的“C编程语言”学习C。我解决了练习2-7,它说:
编写一个函数
invert(x,p,n),返回以n位开头的p位(即1改为0,反之亦然)的n位,其他位不变。
这是我的代码(我在这里自愿使用字符):
#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位吗?谢谢!
发布于 2014-12-26 10:54:35
2^n - 1始终是一个设置了所有n LSB位的数字。
例如:
2 ^ 3 - 1 = 7 => 111
2 ^ 5 - 1 = 31 => 11111在您的例子中,您可以取消for循环来构造这个数字,只需简单地说:
bitsToConvert = (1<<n) - 1;别忘了处理极端的情况。
发布于 2014-12-26 11:17:29
Thrustmaster所说的不需要指定任何"n“的替代方法是按位使用,而不是对空值使用。
variable = ~(variable ^ variable);https://stackoverflow.com/questions/27656021
复制相似问题