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

没有进行特别的优化。其实还可以在拷贝源开始位置和目标开始位置是2的整数倍位置的时候进行优化。

说明

这个函数用于从src数组首地址跳过sbb个字节,又跳过ssb个比特位,拷贝nbits个比特位的数据到dest数组首地址跳过dbb个字节,又跳过dsb个比特位位置。

代码如下

 include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h> //二进制打印输出
void Bp(unsigned char n)
{
int i;
for (i=;i>=;i--)
{
printf("%u",(n>>i)&);
}
} //按比特位拷贝
// 从src数组首地址跳过sbb个字节,又跳过ssb个比特位,拷贝nbits个比特位的数据到
// dest数组首地址跳过dbb个字节,又跳过dsb个比特位位置
int copybits(const unsigned char* src,int sbb/*source begin byte*/,int ssb/*source skip bit*/,
unsigned char* dest,int dbb/*dest begin byte*/,int dsb/*dest skip bit*/,int nbits)
{
// assert(src && dest && sbb>=0 && ssb>=0 && dbb>=0 && dsb>=0 && nbits>=0);
if(src ==NULL || dest == NULL)return -;
if(sbb < || ssb < || dbb < || dsb <)return -;
if(nbits==)return ; if(ssb == dsb){
//边界对其情况
//1拷贝对齐部分
int copybyte=(nbits -(-ssb))/;
memmove(dest+dbb+,src+sbb+,copybyte);
//2拷贝前端不完整字节
if(ssb != ){
unsigned char s=src[sbb];
s &= 0xFF>>ssb;
dest[dbb] &= 0xFF<<(-ssb);
dest[dbb] |= s;
}
//拷贝后端不完整字节
int endbit=(nbits - (- ssb))%;
if(endbit != ){
unsigned char s=src[sbb++copybyte];
s &= 0xFF<<(-endbit);
dest[dbb+ + copybyte] &= 0xFF>>endbit;
dest[dbb+ + copybyte] |= s;
}
return ( - endbit);
}
//------------------------------------------------- int sbgb = sbb* + ssb; //源开始的比特位置
int dbgb = dbb* + dsb; //目标开始比特位置
int i,ret;
int k1,m1,k2,m2;
unsigned char s;
if(((dest - src)*+dbgb) < sbgb ){
// 目标开始位置在源开始位置左边
for(i=;i<nbits;++i){
//拷贝某个位
//1、源位置 目标位置
k1=(sbgb+i)>>; k2=(dbgb+i)>>;
m1=(sbgb+i)&0x7; m2=(dbgb+i)&0x7;
s=src[k1];
s &= 0x80>>m1; //获取源比特位
if(m1!=m2){ //偏移位
s = m1<m2? (s>>(m2-m1)):(s<<(m1-m2));
}
dest[k2] &= (~(0x80>>m2)); //目标位置0
dest[k2] |= s; //目标位赋值
}
}
else{
for(i=nbits-; i >= ;--i){
//拷贝某个位
//1、源位置 目标位置
k1=(sbgb+i)>>; k2=(dbgb+i)>>;
m1=(sbgb+i)&0x7; m2=(dbgb+i)&0x7;
s=src[k1];
s &= 0x80>>m1; //获取源比特位
if(m1!=m2){ //偏移位
s = m1<m2? (s>>(m2-m1)):(s<<(m1-m2));
}
dest[k2] &= (~(0x80>>m2)); //目标位置0
dest[k2] |= s; //目标位赋值
} }
return ( - (dbgb+nbits)%);
} int main()
{
int i;
unsigned char src[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//{0,0x1F,0x0F,0x0F,0x70,0,0,1,1};
unsigned char dst[]={,,,,,,,,}; printf("%d\n",copybits(src,,,dst,,,)); for(i=;i<;++i){
//printf("\t%2x\t%2x\n",src[i],dst[i]);
Bp(src[i]);
putchar(' ');
}
putchar('\n');
for(i=;i<;++i){
//printf("\t%2x\t%2x\n",src[i],dst[i]);
Bp(dst[i]);
putchar(' ');
}
putchar('\n');
return ;
}

一个按比特位拷贝数据的函数copybits的更多相关文章

  1. COPY - 在表和文件之间拷贝数据

    SYNOPSIS COPY tablename [ ( column [, ...] ) ] FROM { 'filename' | STDIN } [ [ WITH ] [ BINARY ] [ O ...

  2. 使用memcpy函数时要注意拷贝数据的长度

    memcpy函数简介 memcpy函数是C/C++语言中的一个用于内存复制的函数,声明在 string.h 中(C++是 cstring).其原型是: void *memcpy(void *desti ...

  3. ZeroMQ接口函数之 :zmq_msg_init_data - 从一个指定的存储空间中初始化一个ZMQ消息对象的数据

    ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_init_data zmq_msg_init_data(3) ØMQ Manual - ØMQ/3.2.5 ...

  4. C语言判断一个32位的数据,有多少位是1,然后用串口发送出来

    今天遇到了一个问题,遇到一个32位的数据,写一个子函数来判断它的多少位是1.我的思路一开始是把这个数据变成一个32位容量的数组然后每个位去比较是不是1,如果是1,就用另一个变量加1.最后返回这个变量. ...

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

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

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

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

  7. vue+element ui项目总结点(四)零散细节概念巩固如vue父组件调用子组件的方法、拷贝数据、数组置空问题 等

    vue config下面的index.js配置host: '0.0.0.0',共享ip (假设你的电脑启动了这个服务我电脑一样可以启动)-------------------------------- ...

  8. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

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

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

随机推荐

  1. C#验证子网掩码的正确性

    1.       IP合法关于IP地址的合法性验证很简单,方法也很多,比如字符串分解.正则表达式等. 2.       子网掩码是否合法简单来讲,子网掩码就类似这样一串数字,前面一段是连续的1, 类似 ...

  2. Java 并发编程之volatile关键字解析

    摘录 1. 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执 ...

  3. C#--网络流Stream、字节数组保存到字符串中

    第一种方法: HttpWebRequest httpwebr = (HttpWebRequest)HttpWebRequest.Create(rstr); httpwebr.Method = &quo ...

  4. php如何发起POST DELETE GET POST 请求

    关于POST,DELETE,GET,POST请求 get:是用来取得数据.其要传递过的信息是拼在url后面,因为其功能使然,有长度的限制 post:是用来上传数据.要上传的数据放在request的he ...

  5. webstorm总结

    webStorm修改文件类型,文件着色 File->Settings->Editor->File Types

  6. 我的J2EE学习历程

    由于最近手头没有JSP项目,所以暂停Hibernate和Spring的研究.个人觉得只有发现某个东西的不足之后再去学习新的东西来弥补这个不足比较好.就好比,最开始在JSP页面里面写Java代码,每次操 ...

  7. 柱状堆积图Echarts

    Map<String,Object> map = new HashMap<String, Object>(); //图例的千人.双百 HashMap<String, St ...

  8. plsql常用函数汇总

    在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set nls_language='SIMPLI ...

  9. linux下vim更改注释颜色

    我linux下默认底色是黑色,字体是绿色,但是注释默认是蓝色,,很不爽...所以要更改注释颜色......以下文章来自转载. from: http://blog.csdn.net/gz109/arti ...

  10. zend stuido 12.5的插件安装和xdebug调试器的配置和和配置注意

    参考: zend stuido 12.5的插件安装 zend 12.5 安装插件是按类别进行分类了的, 而且是在欢迎 界面就可以直接安装, 安装后,要重启zend才能生效 版式设计的一个基本点就是: ...