是关于C语言程序设计的问题!

2024-12-12 10:11:20
推荐回答(1个)
回答1:

前头有个小错,但错得有些离谱,因为p没有赋值,却把x,y都用scanf()赋值后把y破坏掉了。应该把
scanf("%d,%d",&x,&y);
改成
scanf("%u %d", &x, &p);
读入p而不是y,对x也以unsigned格式读入。

另外,unsigned ing类型在不同的机器上位数可能不同,在多数Windows下的编译器(如VC)是32位的,在一般Dos下的编译器(如TC)也是16位的,你现在把它当做8位的数操作,这样也不对。8可以不用,即使要用也应该用sizeof(unsigned int) * 8来代替那个8。

还有就是整个算法的计算设计不良,按你的思路:
y=y>>(8-p);
y=y<<(8-p);
这两句应该是想取y的低p位,这样做不大常用,更多用mask方法:
y &= (~0x0U << p) - 1; /* 其中(~0x0U << p) - 1是后p位是1的数 */
这样也避免了前面那个8。后几句对x的处理类似。
最后一句把高位(x)和低位(y)拼起来,应该用x |= y,而不是异或。
最后的输出也应该用%u而不是%ld。

下面的程序为了方便看各位情况,输入输出使用8进制数,你可以改回来。

#include
#include

int main()
{
unsigned int x, y;
int p;
scanf("%o %d", &x, &p);
y = x;
y &= (0x1 << p) - 1; /* (~0x0U << p) - 1是后p位是1的数 */
x = ~x;
x &= ~((0x1 << p) - 1);
printf("hi = %o, lo = %o\n", x, y);
x |= y;
printf("%o\n", x);
system("pause");
return 0;
}

不过这样的方法并不与提示中想让你用的方法一样。现在是把高位(x)、低位(y)分来来算,而提示是想让你用更聪明的办法。程序如下:

#include
#include

int main()
{
unsigned int x;
int p;
scanf("%o %d", &x, &p);
x ^= ~0x0U << p;
printf("%o\n", x);
system("pause");
return 0;
}

其中~0x0U << p是后p位全为0,其他位是1的数,这个也可以写成~((0x1 << p) - 1)。注意0x0U后面的U不可省略。