c语言读取12位,c – 如何将一个字节数组移位12位

这篇博客探讨了如何通过编程实现12位字节的移动操作,确保数据完整性。作者提到了常规移位可能引发的溢出问题,并提供了两种解决方案:一是循环移位以保留溢出位,二是使用额外的数组存储溢出信息。博主Justin提到的不同携带手段为读者展示了灵活处理数据移动的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hurray为指针!

该代码通过向前查看每个字节12位并将正确的位向前复制. 12位是下一个字节的下半部分(nybble)和2个字节的上半部分.

unsigned char length = 10;

unsigned char data[10] = {0x0,0x0,0xBC};

unsigned char *shift = data;

while (shift < data+(length-2)) {

*shift = (*(shift+1)&0x0F)<<4 | (*(shift+2)&0xF0)>>4;

shift++;

}

*(data+length-2) = (*(data+length-1)&0x0F)<<4;

*(data+length-1) = 0x00;

Justin wrote:

@Mike,your solution works,but does not carry.

那么我会说一个正常的移位操作就是这样(称为溢出),只是让额外的位从右边或左边掉下来.如果您想要 – 只需保存12位,然后再开始移动即可轻松携带.也许你想要一个循环移位,把溢出的位回到底部?也许你想重新配置数组并使其更大?将溢出返回给调用者?如果非零数据溢出,返回一个布尔值?你必须为你定义什么携带手段.

unsigned char overflow[2];

*overflow = (*data&0xF0)>>4;

*(overflow+1) = (*data&0x0F)<<4 | (*(data+1)&0xF0)>>4;

while (shift < data+(length-2)) {

/* normal shifting */

}

/* now would be the time to copy it back if you want to carry it somewhere */

*(data+length-2) = (*(data+length-1)&0x0F)<<4 | (*(overflow)&0x0F);

*(data+length-1) = *(overflow+1);

/* You could return a 16-bit carry int,* but endian-ness makes that look weird

* if you care about the physical layout */

unsigned short carry = *(overflow+1)<<8 | *overflow;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值