| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 357 人关注过本帖
标题:位运算函数出错请各位大神帮忙看看。。。
只看楼主 加入收藏
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:4 
位运算函数出错请各位大神帮忙看看。。。
编译系统如果是逻辑右移,改算术右移,如果是算术右移,改逻辑右移。.我试过编译系统是逻辑右移的。可是现在想改算术右移。函数好像不起作用。
弄来弄去都是逻辑右移的。请各位看看哪里出错了。。。
#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:用函数改为 --算术右移
-------------------------

-------------------------
*/
搜索更多相关主题的帖子: include 广州 顺丰 中介 
2015-11-29 16:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
我不知道你用的什么编译器。我用过的都是对有符号类型进行算数移位,对无符号类型进行逻辑移位。

重剑无锋,大巧不工
2015-11-29 16:47
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
我用的是Visual C++ 6.0
2015-11-29 18:58
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
不好意思,没有这件上古神器。在GCC4.8.1下显示为“算术右移”。
咱位再做个简单的实验
程序代码:
#include<stdio.h>

int main()
{
    int a = -1;
    printf("%d %d\n", a >> 1, (unsigned)a >> 1);
    return 0;
}

该代码我编译后的执行结果是
-1 2147483647
你的呢?

重剑无锋,大巧不工
2015-11-29 23:07
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
谢谢
2015-12-02 11:16
快速回复:位运算函数出错请各位大神帮忙看看。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024863 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved