| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 755 人关注过本帖
标题:【求教+讨论】疑惑,这段代码错哪了?
只看楼主 加入收藏
rayOMG
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2010-10-9
结帖率:83.33%
收藏
已结贴  问题点数:30 回复次数:12 
【求教+讨论】疑惑,这段代码错哪了?
代码如下
/*
输入2个整数i、j,若j大于0,把i循环左移j位(所谓循环就是,假设左边溢出,则补到右边,
反之亦然),若j小于0,则i循环右移j位,然后将循环过的i以16进制输出,以便查看正误。
*/
 

#include<stdio.h>
#include<conio.h>

int main()
{
    int i,j,temp;
   
    printf("请输入您要移位的正整数 :");
    scanf("%d",&i);
    printf("请输入您要循环移位的位数(负数代表左移,正数代表右移): ");
    scanf("%d",&j);
   
    printf("您要移位的数字为%d,其十六进制为0x%x.\n\n",i,i);
   
    if(j==0)
    {
            printf("没有移位。按任意键退出。");
            getch();
            return -1;
    }
   
    if(j>0)
    {
           printf("左移%d位...\n\n",j);
           temp=i>>(32-j);
           i<<=j;
           i|=temp;
    }
    else
    {
        j=-j;
        printf("右移%d位...\n\n",j);
        temp=i<<(32-j);
        i>>=j;
        i|=temp;
    }
   
    printf("移位后的值为%d,十六进制为0x%x\n\n",i,i);
    printf("按任意键退出.");
    getch();
   
    return 0;
}

原题是:编写一个程序,输入两个整数i和j,如过j>0, 则把i循环左移j位;如果j<0,则把i循环右移j位,最后输出i的值。

程序前面的注释是我自己理解的题意,不知道对不对。

运行的图片我截了一个,如下(怎么不能带附件了?我一个字一个字打吧)
*******************************************************************************************************************
*请输入您要移位的正整数:2748                                                                                     *
*请输入您要循环移位的位数(负数代表左移,正数代表右移):-4                                                       *
*您要移位的数字为2748,其十六进制为0xabc                                                                          *
*                                                                                                                 *
*右移4位...                                                                                                       *
*                                                                                                                 *
*移位后的值为-1073741653,十六进制为0xc00000ab                                                                    *
*                                                                                                                 *
*按任意键退出.                                                                                                    *
*******************************************************************************************************************


我预期的结果是(十六进制:0xbca)

疑惑不解~~~~~~~~~~~~~~~~~~~~~~

[ 本帖最后由 rayOMG 于 2010-10-14 15:39 编辑 ]
搜索更多相关主题的帖子: 代码 
2010-10-14 15:32
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:15 
程序代码:
#include<stdio.h>
#include<conio.h>

int main()
{
    int i,j,temp;
   
    printf("请输入您要移位的正整数 :");
    scanf("%d",&i);
    printf("请输入您要循环移位的位数(负数代表左移,正数代表右移): ");
    scanf("%d",&j);
   
    printf("您要移位的数字为%d,其十六进制为0x%x.\n\n",i,i);
   
    if(j==0)
    {
            printf("没有移位。按任意键退出。");
            getch();
            return -1;
    }
   
    if(j>0)
    {
           printf("右移%d位...\n\n",j);
           temp=i>>j;
    }
    else
    {
        j=-j;
        printf("左移%d位...\n\n",j);
        temp=i<<j;
    }
   
    printf("移位后的值为%d,十六进制为0x%x\n\n",temp,temp);
    printf("按任意键退出.");
    getch();
   
    return 0;
}

If You Want Something, Go Get It, Period.
2010-10-14 16:08
troy0215
Rank: 2
等 级:论坛游民
帖 子:16
专家分:71
注 册:2009-5-22
收藏
得分:15 
汇编~
2010-10-14 16:09
troy0215
Rank: 2
等 级:论坛游民
帖 子:16
专家分:71
注 册:2009-5-22
收藏
得分:0 
int型数据是4个字节~
2010-10-14 16:20
rayOMG
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2010-10-9
收藏
得分:0 
m21wo

你写的那个就是单纯的往左 或者往右移嘛

没有循环的意思诶

那个所谓的循环就是,例如一串2进制码 1000 1001 1010 1011 循环左移4位
                               变为 1001 1010 1011 1000

这个意思怎么整呢??
2010-10-14 16:33
rayOMG
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2010-10-9
收藏
得分:0 
呃。。。大家都沉默了??????????????
2010-10-14 16:48
troy0215
Rank: 2
等 级:论坛游民
帖 子:16
专家分:71
注 册:2009-5-22
收藏
得分:0 
你循环移动的时候把i当成一个int型数据,也就是32位的二进制,8位的16进制。它是8位一个整体来移动的,不要想当然的以为前面的0没有意义就不参与循环移动~
2010-10-14 16:57
rayOMG
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2010-10-9
收藏
得分:0 
移位运算是以二进制补码的形式进行的啊,怎么会是8位一个整体来移动呢
2010-10-14 17:10
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:0 
哦!是循环移位啊!
程序代码:
#include<stdio.h>
#include<conio.h>

int main()
{
     int i,j,temp;
   
    printf("请输入您要移位的正整数 :");
    scanf("%d",&i);
    printf("请输入您要循环移位的位数(负数代表右移,正数代表左移): ");
    scanf("%d",&j);
   
    printf("您要移位的数字为%d,其十六进制为0x%x.\n\n",i,i);
   
    if(j==0)
    {
            printf("没有移位。按任意键退出。");
            getch();
            return -1;
    }
   
    if(j>0)
    {
           printf("左移%d位...\n\n",j);
           temp=i>>(sizeof(i)-j);
           i<<=j;
           i|=temp;
    }
    else
    {
        j=-j;
        printf("右移%d位...\n\n",j);
        temp=i<<(sizeof(i)-j);
        i>>=j;
        i|=temp;
    }
   
    printf("移位后的值为%d,十六进制为0x%x\n\n",i,i);
    printf("按任意键退出.");
    getch();
   
    return 0;
}
你看这样行不!

If You Want Something, Go Get It, Period.
2010-10-14 17:22
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:0 
弄错了啊!

If You Want Something, Go Get It, Period.
2010-10-14 17:27
快速回复:【求教+讨论】疑惑,这段代码错哪了?
数据加载中...
 
   



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

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