要想编写十进制转化成二进制的带码首先要清楚十进制转化成二进制的算法,下面我们从两个方面实现这个转化:
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语言版