先说一下应用场合,在LED点阵显示屏中,为了节省flash空间,常用一个bit位来标记哪个灯是否点亮。为了做出比较炫的效果,比如16 * 16像素gif动画边边移动边跳跃。就应用到该思想。

双字节是16bit位,数组的bit位是数组长度乘以8(类型指的是uint8_t),比如uint8_t a[5]长度则是5 * 8 = 40。该函数的思想就是这双字节的16bit位在在数组a[5]中40bit位中移动。当然16bit位在数组中可以移出部分或者移出全部bit位。如下图所示三个中情况。

代码如下所示:

#include

typedef unsigned char uint8_t;

typedef unsigned short uint16_t;

#define VALID_LENGTH16//双字节中的有效长度

/********************************************************************************

p:数组指针

n:数组的有效长度

c:需要移动的双字节

matrixStartPos:游标需要在数组的中bit位中的起始位置,比如26,则相当于起始位置指向

数组下标为3 = 26 / 8,bit为5 = 7 - 26 % 8的那个地方。

doubleByteStartPos:指向双字节的bit位置范围为(0~15),该变量后面会移动

width:从双字节中doubleByteStartPos起始位置开始,截取的bit位的个数

********************************************************************************/

void DoubleByteShiftInMatrix(uint8_t *p, uint8_t n, uint16_t c, uint16_t matrixStartPos, uint8_t doubleByteStartPos, uint8_t width)

{

uint16_t matrix[] = {0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,

0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff};

uint8_t startBytePos = matrixStartPos / 8;//需要覆盖的首字节

uint8_t remainBits= 8 - matrixStartPos % 8;//指需要覆盖的首字节中剩余多少bit位可以被覆盖

uint8_t count = 0;//计算当前已经覆盖了多少bit位

while (count < width)//当已经覆盖的bit位小于字节的宽度,覆盖仍需继续

{

if (remainBits >= width - count)//当前字节剩余的bit位个数大于等于剩余需要覆盖的bit个数时,标志着覆盖进入尾声

{

p[startBytePos] &= ~(matrix[width - count -1 ] << (remainBits + count - width));//覆盖之前把当前的相对应bit位清零,下一行则表示对相对应的bit进行填充

p[startBytePos] |= (((c >> (VALID_LENGTH - doubleByteStartPos - width + count)) & matrix[width - count - 1]) << (remainBits + count - width));

count = width;//这个地方其本质的函数是count = count + (width - count);所以可以简化成了这样,也可以用break

}

else

{

p[startBytePos] &= ~matrix[remainBits - 1];//覆盖之前把相对应的bit位清零,下一行则是从双字节的“起始位置”截图remainBits长度填充当前数组剩余的remainBits位

p[startBytePos] |= ((c >> (VALID_LENGTH - doubleByteStartPos - remainBits)) & matrix[remainBits - 1]);

count += remainBits;//当前回合已经填充了remainBits的长度,进行统计

doubleByteStartPos += remainBits;//填充了remainBits长度后,双字节的起始位置也进行往后移动

startBytePos++;//填充完了一个字节,准备填充下一个字节

remainBits = 8;//新字节剩余填充位置为8

}

}

}

int main()

{

uint8_t p[] = {0x00, 0x00, 0x00, 0x00, 0x00};

int i = 0;

DoubleByteShiftInMatrix(p, 5, 0xffff, 38, 14, 2);

for (; i<5; i++)

{

printf("%d=%02x\r\n", i, p[i]);

}

return 0;

}

字节转换比特位c语言,C语言实现双字节在数组中按比特位移动相关推荐

  1. C语言实例第4期:交换数组中最大数和最小数的位置

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  2. C语言实现埃拉托色尼筛选法(剔除数组中的非质数)

    质数就是只能被1和本身整除的数.Eratosthenes筛选法是一种计算质数的有效方法. 这个算法的第一步就是写下所有从2至某个上限之间的所有整数. 在算法的剩余部分,遍历整个列表并剔除所有不是质数的 ...

  3. C语言把一个数插入到有序数组中使新数组依然有序案例讲解

    我们先看一道例题: 有一个已经排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中. 思路分析 1)这个数组是有序数组,升序降序题意没说,我们就假定这个有序数组是升序的(数字从小到大排序) ...

  4. linux文件字节函数,各位大侠:linux/unix下有什么双字节的字符类型及其一整套处理函数? 高分送出,请帮帮小弟!!!!!!...

    linux/unix下小弟需要操作双字节,相对单字节char 有什么双字节的字符类型及其一整套处理函数,如strstr(),strcpy(),strchr等功能相同的双字节操作函数,它用到什么头文件? ...

  5. c语言定义寄存器中的两位,汇编语言:编写一个程序,显示AL寄存器中的两位十六进制数...

    满意答案 deuej 2013.05.31 采纳率:43%    等级:12 已帮助:9924人 data segment data ends stack segment db256 dup(?) s ...

  6. C语言将一组数输入到一维数组中

    此文章仅面向萌新以及作为个人纪念和学习 设要向一个不知道多少元素的数组里输入元素 数组大小由自己决定 那么就是首先设一个变量作为这个数组里元素的个数 再输入这个个数的数 (嗯,应该能看懂吧doge) ...

  7. C语言100题练习计划 45——在数组中查找指定元素

    名人说:古之立大事者,不惟有超世之才,亦必有坚忍不拔之志.--苏轼 进度:C/C++语言100题练习计划专栏,目前45/100

  8. 【c语言】用指针变量输出一维数组中的数据

    #include<stdio.h> void main(){     int i,*m,a[5];     printf("数组:"); //普通方式输出数组的元素   ...

  9. C语言,往排好序的数组中插入元素

    例题:有一个已经排好序的数组,元素分别是:1,3,5,7,9,从键盘上输入一个元素,将这个元素插入到数组中,使数组仍保持从小到大排序. 输出时各元素的最小宽度为5. 例: (1)输入:0  输出:   ...

最新文章

  1. 客户端dmesg_打印调试技术 printk klogd dmesg(解决打印信息的问题)
  2. 搭建网站服务器是选择高配置还是选择性能稳定?
  3. Vue的数据双向绑定和Object.defineProperty()
  4. IOS debug网络PonyDebugger 实践篇
  5. 05使用jmeter里调试一个下单接口
  6. 聚宽 get_price 多个股票数据_上证指数(000001)股票历史数据,下载上证指数(000001历史数据_股票股市历史数据下载股票数据网...
  7. 背包九讲----02完全背包问题
  8. 程序员不要和陌生人说话——漫谈一些有趣的架构原则
  9. 分享 百度网盘搜索引擎原理以及实现部分源码
  10. GUI 图片显示(SDL 多媒体开发库)——基于 rt-smart 微内核操作系统
  11. SL8100 宽电压100V降压12V-24V大功率LED照明降压恒流驱动芯片IC
  12. 时间拆分法------高效率的使用完成开发工作之外的剩余时间掌握多门开发语言
  13. 解决window 10 Edge浏览器下载速度太慢
  14. 智能硬件类产品测试项目总结
  15. 奥比中光深度摄像头_苹果收购Primesense后,奥比中光希望用它的深度摄像头填补市场空白...
  16. 【工作感悟】java初始化数组长度
  17. ZUCC操作系统原理 周测1
  18. 标普500市值门槛提高今日生效 第一太阳能(First Solar)出局
  19. uniapp 微信小程序实现走势图生成图片分享
  20. android 视频录制 保存到本地

热门文章

  1. Android BLE 蓝牙开发-扫码枪集成
  2. 物联网|蓝牙4.0BLE协议栈简介|IAR集成开发环境简介|IAR各版本下载链接|物联网之蓝牙4.0 BLE基础-学习笔记(2)
  3. 中科院CNICCoremail邮件安全联合实验室在京正式成立
  4. 华为如何实施数字化转型(附PPT)
  5. IDP-个人发展计划
  6. 手机局域网关闭计算机的方法,局域网怎么防泄密?禁止电脑手机互传文件方法...
  7. 新年新迹象,商场购物中心“牛”年如何装扮设计
  8. 【BUG】[ - ddms] Can't bind to local 8700 for debugger
  9. 京东又入AI科学家:裴健加盟任副总裁 负责大数据与产品研发 向刘强东汇报 | 消息
  10. mysql base64 加密解密_烂泥:base64加密与解密