十进制整数转化为二进制详解

要想编写十进制转化成二进制的带码首先要清楚十进制转化成二进制的算法,下面我们从两个方面实现这个转化:

1.按照十进制转化成十进制的常规算法实现:

普通算法实现:

我们举一个简单的例子,比如取整数52
52/2 = 26 余 0;
26/2 = 13 余 0;
13/2 = 6  余 1;
6 /2 = 3  余 0;
3 /2 = 1  余 1;
1- -  - - - -1;     
52 在一步一步进行%2运算中得到的余数为 0 , 0 , 1 , 0 , 1 , 1;
所以52转化成二进制数就是把上面得到的余数按倒叙排列,即110100;
所以,我们在了解了其基本算法以后就可以按照算法步骤进行编程了。
下面献上带码(注:以下代码仅仅可以实现十进制正整数的转化,对于负数不适用,通用的方法下面会进行详解
#include<stdio.h>
//普通方法;
int main()
{
    int a[30], i = 0, x , y;
    printf("请输入一个十进制整数:\n");
    scanf("%d",&x);
    while(x != 0)
    {
        y = x%2;
        a[i] = y;
        i++;        x = x / 2 ;    }    i- -;//按照循环i多加一次,所以要减去一    for(; i >= 0 ; - -i)    {        printf("%d",a[i]);    }    return 0 ;}
由于代码很容易理解所以没有做太多的注释,我想大多数人都可以看懂的。下面我就介绍第二种方法;
优化方法:(负数也可以)
首先我们需要知道数据在内存中是如何存储的,在这里我就不详细说明了,如果你想弄明白可以参考
http://c.biancheng.net/cpp/html/3095.html​     和 http://www.infocool.net/kb/OtherLanguage/201611/209695.html      
数据在内存中存储是以二进制方式进行存储的 ,这里我们可以把整数简单的看成浮点数(这里只当成float)float型的数据在内存中存储时去掉符号位,还有8个指数位,23个尾数位写程序时我们忽略符号位,因为我们输出时不需要输出符号位,只输出数据的二进制形式。
还是从一个简单的例子出发:
十进制数528的二进制码为:0000001000010000

将其取反(求反码)后的结果:1111110111101111
将反码加一(求补码)后结果:1111110111110000
所以,-528的二进制码为1111110111110000
小说一下概念,然后看一个位运算符,按位与(&) :0&0=0 , 0&1=0 , 1&0=0 , 1&1=1
我们知道,奇数的二进制最后一位全部为1而偶数的二进制最后一位全部为0,那么用按位与运算符我们可以很方便地知道一个数是奇数还是偶数,只要让数字 &1 就可以了,因为 奇数&1=1 ,而 偶数&1=0
现在看一段代码,作用是将十进制数转换为二进制数。
#include <stdio.h>
int main()
{
int x,i;
scanf("%d",&x);
for(i=31;i>=0;i--) printf("%d",x>>i&1);
system("pause");
}

重点就在 x>>i&1 啦,每次按照能否被二整除来确定0或者1,然后一位一位的移动。

参考文献:Slyar Home » 正负数十进制转二进制 位运算 C语言版


             



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴着眼镜看不清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值