在程序开发过程中,我们经常会用到按位拷贝一串二进制数,在此提供一个按位拷贝的函数给大家参考,函数源码如下:

  1. #define char_t char
  2. #define uint8_t unsigned char
  3. #define int8_t signed char
  4. #define uint16_t unsigned short
  5. #define int16_t signed short
  6. #define uint32_t unsigned long int
  7. #define int32_t signed long int
  8.  
  9. /*
  10. * param[in] SrcData: source data
  11. * param[in] StartsrcBit: start source bit(1, 2, 3, ...)
  12. * param[in] startdstbit: start destination bit(1, 2, 3, ...)
  13. * param[in] CopyLen: copy length
  14. * param[out] DstData: destination data
  15. */
  16. void copy_data_by_bits(uint8_t *DstData, uint32_t startdstbit, uint8_t *SrcData, uint32_t StartsrcBit, uint32_t CopyLen)
  17. {
  18. uint32_t copysrcbyte = ;
  19. uint32_t copysrcbitofbyte = ;
  20. uint32_t copydstbyte = ;
  21. uint32_t copydstbitofbyte = ;
  22. uint32_t dataLen = CopyLen;
  23.  
  24. if ((NULL == SrcData) || (NULL == DstData)) {
  25. printf("SrcData or DstData is NULL !!!\n");
  26. return;
  27. }
  28.  
  29. while (dataLen > ) {
  30. copydstbyte = ((startdstbit + dataLen) / );
  31. copydstbitofbyte = ((startdstbit + dataLen) % );
  32. copysrcbyte = ((StartsrcBit + dataLen) / );
  33. copysrcbitofbyte = ((StartsrcBit + dataLen) % );
  34.  
  35. if ( == copysrcbitofbyte) {
  36. copysrcbitofbyte = ;
  37. copysrcbyte = copysrcbyte - ;
  38. }
  39.  
  40. if ( == copydstbitofbyte) {
  41. copydstbitofbyte = ;
  42. copydstbyte = copydstbyte - ;
  43. }
  44.  
  45. DstData[copydstbyte] &= ~( << (copydstbitofbyte - ));
  46. if ((SrcData[copysrcbyte] & ((uint8_t)((uint8_t) << (copysrcbitofbyte - )))) != ) {
  47. DstData[copydstbyte] |= ((uint8_t) << (copydstbitofbyte - ));
  48. }
  49. dataLen--;
  50. }
  51. }

测试代码:

  1. int main(void)
  2. {
  3. uint8_t SrcData[] = {0x12, 0x34, 0x56, 0x78};
  4. uint32_t StartsrcBit = ;
  5. uint32_t CopyLen = ;
  6. uint8_t DstData[] = {};
  7. uint32_t startdstbit = ;
  8.  
  9. DstData[] = 0xab;
  10. copy_data_by_bits(DstData, startdstbit, SrcData, StartsrcBit, CopyLen);
  11. printf("DstData[0]:%#04x DstData[1]:%#04x\n", DstData[], DstData[]);
  12.  
  13. return ;
  14. }

分析如下:

C语言实现按位拷贝的更多相关文章

  1. C语言中的位拷贝与值拷贝浅谈(转载)

    注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象 ...

  2. c++的默认构造函数 VS 深拷贝(值拷贝) 与 浅拷贝(位拷贝)

    C++默认为类生成了四个缺省函数: A(void); // 缺省的无参数构造函数 A(const A &a); // 缺省的拷贝构造函数 ~A(void); // 缺省的析构函数 A & ...

  3. C语言中两位ASCII码可以表示汉字

    最近偶然有人问到这个相关字符编码的问题,所以百度了下参考了这两个资料,进行了简单分析. ******************************************************** ...

  4. 深入理解计算机系统(2.2)---布尔代数以及C语言上的位运算

    布尔代数上的位运算 布尔代数是一个数学知识体系,它在0和1的二进制值上演化而来的. 我们不需要去彻底的了解这个知识体系,但是里面定义了几种二进制的运算,却是我们在平时的编程过程当中也会遇到的.这四种运 ...

  5. 一个按比特位拷贝数据的函数copybits

    一个按比特位拷贝数据的函数 没有进行特别的优化.其实还可以在拷贝源开始位置和目标开始位置是2的整数倍位置的时候进行优化. 说明 这个函数用于从src数组首地址跳过sbb个字节,又跳过ssb个比特位,拷 ...

  6. 【转载】C++中的位拷贝和值拷贝

    ---恢复内容开始--- 原文:C++中的位拷贝和值拷贝 原文:http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以Strin ...

  7. 【转】C++中的位拷贝与值拷贝

    [转]http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以String类为例: 首先定义String类,而并不实现其成员函数. ...

  8. C语言中的位运算和逻辑运算

    这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...

  9. C/C++语言中的位运算

    在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作. 一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率.C语 ...

随机推荐

  1. Linux 内核引用计数的操作

    一个 kobject 的其中一个关键函数是作为一个引用计数器, 给一个它被嵌入的对象. 只 要对这个对象的引用存在, 这个对象( 和支持它的代码) 必须继续存在. 来操作一个 kobject 的引用计 ...

  2. Qt和c/c++connect函数冲突解决方法

    在使用c/c++的connect函数时在前面写::connect()这样就可以解决了

  3. HDU1172猜数字 [模拟]

    1.题意 任务是猜一个四位数,每次尝试后会给出这次猜中了几个数字和猜中了几个位置,求能否根据尝试的记录给出答案 2.分析 数据给出查询次数和每次查询的数及其有几个数和几个位置符合,值得注意的是,猜对的 ...

  4. 国内免费CMS系统大全

    一.ASP类的CMS程序 1.动易CMS 官方网址:http://www.powereasy.net/(可免费下载) 特点:完全免费,ACCESS数据库,主要功能模块:文章频道.下载频道.图片频道.留 ...

  5. Delphi XE里的StrPas要注意哦(要让StrPas知道哪里是字符串结束)

    废话不多说了,直接上例子解说: procedure TForm1.Button1Click(Sender: TObject);var  aa: array[0..1]of AnsiChar;  bb1 ...

  6. 基于 Apache APISIX 的下一代微服务架构

    2019 年 12 月 14 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 广州站活动,Apache APISIX PPMC 温铭做了题为 ...

  7. JavaScript之DOM操作,事件操作,节点操作

    1,DOM操作 1.1  概念 所谓DOM,全称Document Object Model 文档对象模型,DOM是W3C(World Wide Web Consortuum )标准,同时也定义了访问诸 ...

  8. Flink State Backends (状态后端)

    State Backends 的作用 有状态的流计算是Flink的一大特点,状态本质上是数据,数据是需要维护的,例如数据库就是维护数据的一种解决方案.State Backends 的作用就是用来维护S ...

  9. C++版本的UnEscape 解析\uxxxx\uxxxx编码字符

    解析类似于这种Unicode编码格式的字符串 \u5b55\u5987\u88c5\u590f\u88c52018\u65b0\u6b3e\u5bbd\u677e\u77ed\u8896\u4e2d\ ...

  10. 洛谷$P2150\ [NOI2015]$寿司晚宴 $dp$

    正解:$dp$ 解题报告: 传送门$QwQ$. 遇事不决写$dp$($bushi$.讲道理这题一看就感觉除了$dp$也没啥很好的算法能做了,于是考虑$dp$呗 先看部分分?$30pts$发现质因数个数 ...