其他进制转换成二进制

0. 背景

在嵌入式开发中,我们要操作寄存器,都是按bit 来操作的,但是我们的数据一般都是十进制或者十六进制,经过一些位运算,很难看明白一个某一位是多少,所以我们开发一个打印函数,来看看具体某一位是多少。

一、十进制转二进制

https://www.cnblogs.com/haoran123/p/17782069.html

转换方法,见上面的链接:

下面我将介绍一种,将几个数存到一个数中,然后从这个数中分解出前面存入的数的例子:

#include <stdio.h>
#include "d2b.h"

int main(int argc,char *argv[])
{
        int ret;
        int com_num=0;
        unsigned char a,b,c,d;

        a=127;
        b=126;
        c=125;
        d=124;

        printf("\n==============================================\n");
        printf("\na=%d,b=%d,c=%d,d=%d,com_num=%d\n",a,b,c,d,com_num);

        ret=print_D2B(a);
        ret=print_D2B(b);
        ret=print_D2B(c);
        ret=print_D2B(d);

        com_num = (a&0xFF);
        com_num |= (b&0xFF)<<8;
        com_num |= (c&0xFF)<<16;
        com_num |= (d&0xFF)<<24;

        ret=print_D2B(com_num);

        printf("\na=%d,b=%d,c=%d,d=%d,com_num=%d\n",a,b,c,d,com_num);

        unsigned char e,f,g,h;

        e = com_num&0xFF;
        f = (com_num>>8)&0xFF;
        g = (com_num>>16)&0xFF;
        h = (com_num>>24)&0xFF;

        printf("\ne=%d,f=%d,g=%d,h=%d,com_num=%d\n",e,f,g,h,com_num);

        printf("\n==============================================\n");
        return 0;
}

  

结果:

==============================================

a=127,b=126,c=125,d=124,com_num=0

 127 的二进制形式为:
00000000|00000000|00000000|01111111

 126 的二进制形式为:
00000000|00000000|00000000|01111110

 125 的二进制形式为:
00000000|00000000|00000000|01111101

 124 的二进制形式为:
00000000|00000000|00000000|01111100

 2088599167 的二进制形式为:
01111100|01111101|01111110|01111111

a=127,b=126,c=125,d=124,com_num=2088599167

e=127,f=126,g=125,h=124,com_num=2088599167

==============================================

  

组合后的com_num 是没有意义的,但是可以看到通过位运算,我们能清楚的知道存入的数对不对。(也算是一种数据的隐藏方法吧)

其实这里,你还可以看到unsigned char / char 的区别,unsigned int / int的区别等等。可以自行修改,看看结果去感受哟。

int ,signed int 定义有符号的整形变量,数据有正有负, 这种数据输出的时候用%d
unsigned int 定义无符号的整形变量,数据只有正数,这种数据输出的时候用%u

二、十六进制转二进制

 原理和上面差不多,就直接上代码吧。这里主要是用于嵌入式中观察寄存器的值。

#include <stdio.h>
#include <string.h>

#define REG_LEN 32

int main(int argc,char *argv[]) 
{ 
	unsigned int i, j, k, num;
	unsigned char num_str[REG_LEN];	
	unsigned char str_num[REG_LEN];

	puts("请输入16进制自然数:");
	scanf("%x", &num);

	if(num > 0xffffffff){
		printf("输入的十六进制数应该小于8位\n");
		return -1;
	}	

	for(i=0;num!=0; ++i)
	{  
		num_str[i]=num%2;
		num/=2;
	}

	for(j=0; j<i; ++j){
		str_num[j]= num_str[i-j-1]>0 ? '1' : '0';
	}

	str_num[j]='\0';
	puts("转换成2进制字符串:"); 
	puts(str_num);

	int len=strlen(str_num);
	printf("str_num len is: %d\n",len);

	for(k=0;k<REG_LEN;k++){
		
		if(k%4==0 && k>=4){
                        printf("|");
                }

		if(k<(REG_LEN-len)){
			printf("0");
		}else{
			printf("%c",str_num[k-(REG_LEN-len)]);
		}
	}
	printf("\n");
}

  

结果为:

请输入16进制自然数:
0xABCDEF98
转换成2进制字符串:
10101011110011011110111110011000
str_num len is: 32
1010|1011|1100|1101|1110|1111|1001|1000

  

这样,看寄存器值是不是一目了然了?

posted @ 2023-10-24 20:00  皓然123  阅读(169)  评论(0)    收藏  举报