【C/C++】拆分字节到位,组合位到字节

目录

一、问题情境

二、拆分字节到位

三、组合位到字节

四、结尾


一、问题情境

        在开发 MAX7219 级联点阵屏全屏刷写的时候,发现屏幕显示的逻辑和正常的操作逻辑有些出入,用的 LedControl 驱动库,年纪越大人越懒,不想自己写驱动了,所以也就顺着驱动库的逻辑,想着将两者之间融合一下。期间遇到的就是如何在“1字节和8位之间进行拆分和组合”,现将实现进行记录。

二、拆分字节到位

        假设字节内容为 00111111(即0x3f),要将每个位都提取出来,即bit7~bit0的值。

        此处用到位运算中的与(&),00111111 & 00000001 = 00000001,简化一下就是 00111111 & 0x01 = 1,由此取得最低位即 bit0 = 1,同理只要将其他的位往右推(使用 >> 运算),再去 &0x01,就能拆分出所有的位。

int byte_comb = 0b00111111;

int bit7 = (byte_comb >> 7) & 0x01;
int bit6 = (byte_comb >> 6) & 0x01;
int bit5 = (byte_comb >> 5) & 0x01;
int bit4 = (byte_comb >> 4) & 0x01;
int bit3 = (byte_comb >> 3) & 0x01;
int bit2 = (byte_comb >> 2) & 0x01;
int bit1 = (byte_comb >> 1) & 0x01;
int bit0 = (byte_comb >> 0) & 0x01;

printf("%d %d %d %d %d %d %d %d ", bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0);
三、组合位到字节

        同样的,有拆就有装,现在要将8个位组合成1个字节,核心思想就是用或运算(|),当然与拆分时往右边位移相反,现在要将数据使用 << 运算从最低位挪回相应的位置。

int bit7 = 0;
int bit6 = 0;
int bit5 = 1;
int bit4 = 1;
int bit3 = 1;
int bit2 = 1;
int bit1 = 1;
int bit0 = 1;

int comb = (bit7 << 7) | (bit6 << 6) | (bit5 << 5) | (bit4 << 4) | (bit3 << 3) | (bit2 << 2) | (bit1 << 1) | (bit0 << 0);

printf("0x%x", comb);
四、结尾

        由于代码不多,容易理解,也就不放仿真结果,实际代码均经过验证。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值