注册 登录
编程论坛 C++教室

c:十进制转换二进制

人_神 发布于 2013-08-02 21:31, 1272 次点击
//十进制转换二进制
#include <stdio.h>
int main ()
{
/*    int data,i;
    printf("输入整数:");
    scanf("%d",&data);
    for (i=0;i<33;i++)
    {
        data & 1<<(32-i) ? printf("1") : printf("0");
    }
    printf("\n");
*/
    int data,i,j,sum1=1,sum2=1;
    printf("输入整数:");
    scanf("%d",&data);
    switch (data)
    {
        case 0: for (i=0;i<32;i++)
                printf("0");
            printf("\n");break;
        case 1: for (i=0;i<31;i++)
                printf("0");
            printf("1\n");break;
        default:
        for (i=0;sum1<=data;i++)
            sum1 *= 2;
        for (j=i;j<32;j++)
            printf("0");
        if (sum1==data)
        {
            printf("1");
            sum1=0;
        }
        else
        {
            sum1 = data - sum1/2;
            printf("1");
        }
        for (i=i-1,sum2=1;i>1;i--)
        {
            for (j=1;j<i;j++)
            {
                sum2 *= 2;
            }
            if (sum1>=sum2)
            {
                printf("1");
                sum1 -= sum2;
            }
            else
                printf("0");
        }
        if (sum1)
            printf("1");
        else
            printf("0");
        printf("\n");
    }
    return 0;
}
输入10,输出2进制是错的,输入7,输出2进制是对的。为什么?求指教
9 回复
#2
wp2319572013-08-02 21:32
分太少

ps: 一个进制转换问题 能用这么多代码   太奢侈了
#3
人_神2013-08-02 22:40
我是新手,还不能熟练运用位运算符,还请多指教。
#4
天使梦魔2013-08-02 22:45
十进制转二进制,你先拿个笔和纸把十进制不停的除2下去余0就是0,1就是1
然后不用sdk提供的函数话,用循环加/除号和%除余号就可以了

你先确定下十进制转二进制原理
#5
peach54602013-08-03 06:53
回复 3楼 人_神
进制转换涉及到移位?
你代码的逻辑是怎样的?能写出来看看吗?
#6
wp2319572013-08-03 07:30
我这有一段10进制转任意进制的代码(自己以前写的)
程序代码:
#include <stdio.h>
#include <string.h>

//10进制转任意进制
//函数由调用者申请内存
int index=0;
void dec2yyy(int yyy,int source,char* bin)
{
    if(source==0) return;
    dec2yyy(yyy,source/yyy,bin);
    if((source%yyy)<10) bin[index]=(char)(source%yyy+0x30);
    else bin[index]=(char)(source%yyy+0x37);
    index++;
}


int main (int argc, char *argv[])
{
    //下面以2-8-16进制为代表进行演示
    int testdata=123456789;
    char dest[100]={'\0'};
    //10转2
    dec2yyy(2,testdata,dest);
    printf("原始数据(10)进制%d=转换后进制(2)%s\n",testdata,dest);
    //10转8
    memset(dest,0,sizeof(dest));
    index=0;
    dec2yyy(8,testdata,dest);
    printf("原始数据(10)进制%d=转换后进制(8)%s\n",testdata,dest);
    //10转16
    memset(dest,0,sizeof(dest));
    index=0;
    dec2yyy(16,testdata,dest);
    printf("原始数据(10)进制%d=转换后进制(16)%s\n",testdata,dest);
    return 0;
}
//输出示例
/*

原始数据(10)进制123456789=转换后进制(2)111010110111100110100010101
原始数据(10)进制123456789=转换后进制(8)726746425
原始数据(10)进制123456789=转换后进制(16)75BCD15
*/


#7
人_神2013-08-03 23:42
根据定义。如 10=1*2^3+0*2^2+1*2^1+0*2^0
权重:1   0   1   0
 10-8=2    2-2=0
10转2:有权添一,无权补0
#8
逆风而前2013-09-06 19:44
#include<stdio.h>
void main(void)
{
    void calculate(int a);
    int num10;
    printf("请输入一个十进制数:");
    scanf("%d",&num10);
    calculate(num10);
}
void calculate(int a)
{
    int b,c;
    c=a%2;
    b=a/2;
    if(b!=0)
    {
      calculate(b);
    }
    printf("%d",c);
}
#9
小男孩的围裙2013-09-06 20:53
回复 8楼 逆风而前
能看得懂,但是有些地方不明白,求解释下。
例如输入10,c依次得到的应该是0101,为什么在后面输出的时候会倒序成1010了。
帮忙解惑下,谢谢。
#10
人_神2013-09-08 13:59
递归运算,如果不明白可以查看书中的先相关只是
1