其他进制转换成二进制
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
这样,看寄存器值是不是一目了然了?
浙公网安备 33010602011771号