关于二进制和十进制之间相互转化的问题

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
 int i = 30;
 printf("转变后的二进制形式是:");
 while (i!=0)
 {
  if (i % 2 == 0)
  {
   printf("0");
  }
  else if (i % 2 == 1)
  {
  printf("1");
  }
  i = i /2;
 }
 system("pause");
 return 0;
}

这样的代码是把一个数字反转,比如将25,的二进制反转后的二进制的十进制输出。
但是这段代码存在一个缺陷就是无法将所求出的二进制数再次转为十进制,所以不可取。

那么怎样把一个十进制数字变成二进制数字呢,在c语言中并没有某一个固定的符号,可以将一个数字拿二进制输出,但是我们可以通过代码来实现。

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int zhuanbian_erjinzhi(int num, int* arr)
{
 int jishu = 0;
 for (jishu; num != 0;++jishu)
 {
  arr[jishu] = (num & 0x1);
  num = num >> 1;
 }
 return jishu;
}
int main()
{
 int shuzuchangdu;
 int arr[1024] = { 0 };
 int num = 0;
 scanf("%d", &num);
 shuzuchangdu=zhuanbian_erjinzhi( num,  arr);
 for (shuzuchangdu=shuzuchangdu-1; 0 <= shuzuchangdu; shuzuchangdu--)
 {
  printf("%d", arr[shuzuchangdu]);
 }

这一段代码是把一个十进制转换成二进制,怎么转换呢,先定义一个计算数组长度的值,然后再通过位操作符&,(位操作符就是把数字先转变成 二进制然后再进行位运算 )拿出要求数字的二进制的最低位,然后在通过移位操作符,再拿出下一位,每拿出一位,计数字符加1,然后把每个最低位都放在数组里面,最后传出数组长度,接着运用循环,由最高位开始打印二进制排列。

int main()
{
 int i = 0;
 int j = 0;
 int num = 0;
 scanf("%d", &num);
 int arr[1024] = { 0 };
 while (num != 0)
 {
  arr[i]=num & 0x1;
  num = num >> 1;
  ++i;
 }
 printf("反转后的二进制数是:");
 for (j; j<i; j++)
 {
  printf("%d", arr[j]);
 }
 printf("\n");
 int sum = 0, SUM = 0, w = 0;
 printf("反转后的二进制数十进制表示是:\n");
 for (j=j-1; j >= 0; j--,w++)
 {
  sum = arr[j ] * (int )pow(2, w);
   SUM = SUM + sum;
 }
 printf("%d\n", SUM);

这段代码是把一个十进制数按二进制反转,然后再将反转的数字按十进制输出,需要注意的是i++虽然是从0开始计算的,但是由于循环导致i比预算的要大1,导致j也是大1

猜你喜欢

转载自blog.csdn.net/weixin_43767691/article/details/88544478