C语言实现按位拷贝

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

  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        = 0;  
  19.     uint32_t copysrcbitofbyte   = 0;  
  20.     uint32_t copydstbyte        = 0;  
  21.     uint32_t copydstbitofbyte   = 0;  
  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 > 0)  {  
  30.         copydstbyte       = ((startdstbit + dataLen) / 8);  
  31.         copydstbitofbyte  = ((startdstbit + dataLen) % 8);  
  32.         copysrcbyte       = ((StartsrcBit + dataLen) / 8);  
  33.         copysrcbitofbyte  = ((StartsrcBit + dataLen) % 8);  
  34.     
  35.         if (0 == copysrcbitofbyte) {  
  36.             copysrcbitofbyte = 8;  
  37.             copysrcbyte      = copysrcbyte - 1;  
  38.         }  
  39.     
  40.         if (0 == copydstbitofbyte) {  
  41.             copydstbitofbyte = 8;  
  42.             copydstbyte      = copydstbyte - 1;  
  43.         }  
  44.     
  45.         DstData[copydstbyte]  &= ~(1 << (copydstbitofbyte - 1));  
  46.         if ((SrcData[copysrcbyte] & ((uint8_t)((uint8_t)1 << (copysrcbitofbyte - 1)))) != 0) {  
  47.             DstData[copydstbyte] |= ((uint8_t)1 << (copydstbitofbyte - 1));  
  48.         }  
  49.         dataLen--;  
  50.     }  
  51. }  

测试代码:

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

分析如下:

原文地址:https://www.cnblogs.com/mrlayfolk/p/11965260.html

时间: 2025-01-02 01:40:24

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

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

注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝. 位拷贝,及"bitwise assignment"是指将一个对象的内存映像按位原封不动的复制给另一个对象,所谓值拷贝就是指,将原对象的值复制一份给新对象. 在用"bitwise assig

solidworks 2013 多国语言32 64位(带注册机)全功能

Autodesk.SoftImage.v2014.Linux64-ISO 1DVD Global.Energy.Mapper v14.1.4.2 Win32 1CD LMS.Imagine.LAB.Amesim.R12-ISO 1DVD LMS.Test.LAB.Rev12A.SL2-ISO 1DVD Remcom XFDTD 7.3.0.3 Win64 1CD Tekla.Structures.v19.0.WIN64-ISO 1DVD  ACD.Systems.Canvas.GIS.v14.0

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

---恢复内容开始--- 原文:C++中的位拷贝和值拷贝 原文:http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以String类为例: 首先定义String类,而并不实现其成员函数. Class String { public: String(const char *ch=NULL);//默认构造函数 String(const String &str);//拷贝构造函数 ~String(void); String &

黑马程序员——c语言学习心得——位运算符

黑马程序员——c语言学习心得——位运算符 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 1. 按位与运算 按位与运算符"&"是双目运算符.其功能是参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果位才为1 ,否则为0.参与运算的数以补码方式出现. 例如:9&

黑马程序员——c语言学习心得——位运算符a

黑马程序员——c语言学习心得——位运算符 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h>void func(int n, char  str[ ][5] ){int i;for(i = 0; i < n; i++)  printf("/nstr[%d] = %s/n"

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

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer6.html 布尔代数上的位运算 布尔代数是一个数学知识体系,它在0和1的二进制值上演化而来的. 我们不需要去彻底的了解这个知识体系,但是里面定义了几种二进制的运算,却是我们在平时的编程过程当中也会遇到的.这四种运算分别是或.与.非和异或.下图展示了在布尔代数的知识体系中,对这四种运算的定义. 从左至右依次是非.与.或以及异或.这个图阐述的是针对一位二进制的运算结果,我们可以将其扩大到N位二进

c语言 保留两位小数

用C其实也挺简单的,有个投机取巧的办法我的想法是,既然希望保留两位小数,那么就必须看第三位小数,如果大于5,就进位,那么我们可以让第三位加上5,因为最后第三位是舍掉的,因此无论怎么改变第三位也没有问题.这样就想起了强制类型转换,呵呵,自己乘上100,然后加上0.5,再强制类型转换成int,将第三位舍掉,自己除100,恢复原来的数字. #include<iostream>using namespace std;int main(){  float length=1.9865;  length*=

【ThinkingInC++】57、位拷贝和初始化

HowMany.cpp /** * 书本:[ThinkingInC++] * 功能:位拷贝和初始化 * 时间:2014年9月21日17:14:30 * 作者:cutter_point */ //位拷贝拷贝的是地址,而值拷贝则拷贝的是内容. #include <fstream> #include <cstring> using namespace std; ofstream out("HowMany.txt"); class HowMany { static in

“位拷贝”和“值拷贝”的区别(c++)

以string类为例: 位拷贝拷贝的是地址,而值拷贝拷贝的是内容. 若定义string类的两个对象为str1,str2.str1._str和str2._str分别指向一块空间. str1._str = "zhang",str2._str = "tian". 若默认拷贝构造函数,即str1(str2).编译器将str2进行一份位拷贝.str1和str2指向同一块空间. 若默认赋值函数,即str1 = str2.编译器将str2的值赋值给str1,进行的也是位拷贝. 无