按位解析32位数的小程序

按位解析, 按结构体解析 一个32位的程序  parse32.c

#include <stdio.h>


union INT32BITS {
//
struct PERI_CRG143_HI3559AV100
{
unsigned int sdio2_sam_dll_ssel:13;
unsigned int sdio2_sam_dll_mode:1;
unsigned int reserved1_bit14:1;
unsigned int sdio2_sam_dll_bypass:1;
unsigned int sdio2_sam_dll_slave_en:1;
unsigned int sdio2_sam_dll_tune:4;
unsigned int reserved_bit21:1;
unsigned int sdio2_rx_srst_req:1;
unsigned int sdio2_tx_srst_req:1;
unsigned int sdio2_cksel:3;
unsigned int sdio2_srst_req:1;
unsigned int sdio2_cken:1;
unsigned int sdio2_drv_dll_srst_req:1;
unsigned int sdio2_sam_dll_srst_req:1;
unsigned int reserved_bit31:1;
}peri_crg143;
unsigned int value;
};




void main(int argc, char **argv)
{
int i;


int value;
sscanf(argv[1],"0x%x",&value);
//strtol(argv[1], &value, 13);
printf("argv1 =%s \n", argv[1]);
printf("atoi argv1 =%x \n", value);


printf("value =0x%x \n", value);

for(i=0;i<32;i++){
printf("bit%02d ",31-i);
}
printf("\n");

for(i=0;i<32;i++){
int tmp = value;
tmp>>=(31-i);
if(tmp & 1)
printf("   1  ");
else
printf("   0  ");

}
printf("\n");


union INT32BITS src;
src.value =value;


printf("sdio2_sam_dll_ssel[12:0] = %X \n", src.peri_crg143.sdio2_sam_dll_ssel);
printf("sdio2_sam_dll_mode[13] = %X \n", src.peri_crg143.sdio2_sam_dll_mode);
printf("reserved1_bit14[14] = %X \n", src.peri_crg143.reserved1_bit14);
printf("sdio2_sam_dll_bypass[15] = %X \n", src.peri_crg143.sdio2_sam_dll_bypass);
printf("sdio2_sam_dll_slave_en[16] = %X \n", src.peri_crg143.sdio2_sam_dll_slave_en);
printf("sdio2_sam_dll_tune[20:17] = %X \n", src.peri_crg143.sdio2_sam_dll_tune);
printf("reserved_bit21[21] = %X \n", src.peri_crg143.reserved_bit21);
printf("sdio2_rx_srst_req[22] = %X \n", src.peri_crg143.sdio2_rx_srst_req);
printf("sdio2_tx_srst_req[23] = %X \n", src.peri_crg143.sdio2_tx_srst_req);
printf("sdio2_cksel[26:24] = %X \n", src.peri_crg143.sdio2_cksel);
printf("sdio2_srst_req[27] = %X \n", src.peri_crg143.sdio2_srst_req);
printf("sdio2_cken[28] = %X \n", src.peri_crg143.sdio2_cken);
printf("sdio2_drv_dll_srst_req[29] = %X \n", src.peri_crg143.sdio2_drv_dll_srst_req);
printf("sdio2_sam_dll_srst_req[30] = %X \n", src.peri_crg143.sdio2_sam_dll_srst_req);
printf("reserved_bit31[31] = %X \n", src.peri_crg143.reserved_bit31);

}


编译:

gcc -o parse32 parse32.c


使用方法:

./parse32  0x77000000


执行结果:

argv1 =0x77000000 
atoi argv1 =77000000 
value =0x77000000 
bit31 bit30 bit29 bit28 bit27 bit26 bit25 bit24 bit23 bit22 bit21 bit20 bit19 bit18 bit17 bit16 bit15 bit14 bit13 bit12 bit11 bit10 bit09 bit08 bit07 bit06 bit05 bit04 bit03 bit02 bit01 bit00 
   0     1     1     1     0     1     1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0  
sdio2_sam_dll_ssel[12:0] = 0 
sdio2_sam_dll_mode[13] = 0 
reserved1_bit14[14] = 0 
sdio2_sam_dll_bypass[15] = 0 
sdio2_sam_dll_slave_en[16] = 0 
sdio2_sam_dll_tune[20:17] = 0 
reserved_bit21[21] = 0 
sdio2_rx_srst_req[22] = 0 
sdio2_tx_srst_req[23] = 0 
sdio2_cksel[26:24] = 7 
sdio2_srst_req[27] = 0 
sdio2_cken[28] = 1 
sdio2_drv_dll_srst_req[29] = 1 
sdio2_sam_dll_srst_req[30] = 1 
reserved_bit31[31] = 0 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值