位运算函数出错请各位大神帮忙看看。。。
编译系统如果是逻辑右移,改算术右移,如果是算术右移,改逻辑右移。.我试过编译系统是逻辑右移的。可是现在想改算术右移。函数好像不起作用。弄来弄去都是逻辑右移的。请各位看看哪里出错了。。。
#include<stdio.h>
#include<conio.h>
signed ar1(signed a,int n)//逻辑右移 改为 算术右移
{
unsigned b,c;
b = ~(~ 0 >> n);//把 0 取反,得到的16位都是 1 。再向右移n位,则最左边的是 0 ,向右都是 1 。再取反。
c = (a >> n) | b;//把 a 右移n位如果是逻辑右移,那么最左边的位上如果是 1 那么就会被 0 代替。
return(c);//正负符号的 1 。补上。那么就可以把逻辑右移改为算术右移了。
}
unsigned ar2(signed a,int n)//算术右移 改为 逻辑右移
{
unsigned z;
z = (~0 >> n) & (a >> n);//0取反都是 1 。右移n位得到的是左边n位是0,而右边的是1.再把(a >> n)和它做按位与运算就能把左前n位清零。
return(z);
}
int main(void)
{
int a;
int n,m,f;
signed b;
m = ~0;
if( (m >> 8) != m ) //如果是逻辑右移那么左边会补满 0。自然不等。
{
printf("C编译系统是逻辑右移运算\n");
f = 0;
}
else //如果是算术右移那么左边会补满 1 。自然相等。
{
printf("C编译系统是算术右移运算\n");
f = 1;
}
printf("请输入一个八进制数:");
scanf("%o",&a);
printf("请输入要移动的位数:");
scanf("%d",&n);
if(f == 0)b = ar1(a,n); //如果是逻辑右移,用算术右移函数。
if(f == 1)b = ar2(a,n); //如果是算术右移,用逻辑右移函数。
printf("a = %o\nb = %o\n",a,b);
getch();
return 0;
}
/*
程序运算结果1:编译系统是按 --逻辑右移-- 运算的
---------------------
请输入一个八进制数:145432
a = 145432
b = 62615 //逻辑右移运算的结果。
---------------------
程序运行结果2:用函数改为 --算术右移
-------------------------
-------------------------
*/