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

没有进行特别的优化。其实还可以在拷贝源开始位置和目标开始位置是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. 微信下输入法在IOS和安卓下的诡异

    1.验证window.innerHeight 系统版本 iOS9.1.1 安卓4.4.4 没有输入法的情况下 504 567 有输入法的情况下 208 273 看来两者的window.innerHei ...

  2. ecshop 调用收货地址

    html {insert_scripts files='region.js,utils.js'} <script type="text/javascript"> reg ...

  3. 路径 dirname(__FILE__)

    require(dirname(__FILE__).'/include/init.php');

  4. Blue tooth

    一 . nordic BLE4.0 1.开发nordic的应用需要安装支持keil的pack库和插件 2.nordic的SDK很完整,实例涵盖了几乎所有的应用 https://www.nordicse ...

  5. mvn filter autoconfig 产生自动配置

    可以使用filter, 也可以使用autoconfig 详细请见 http://www.openwebx.org/docs/autoconfig.html

  6. OC-改错题

    1,类方法中不能访问成员变量 2,id后不能加*(因为id相当于NSObject *) 3,id类型的变量不能用点语法 4,类对象只能调用类方法,不能调用对象方法 .description #impo ...

  7. Spring之FactoryBean

    首先要分辨BeanFactory 与 FactoryBean的区别, 两个名字很像,所以容易搞混 BeanFactory: 以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂 Fa ...

  8. Apache Maven 入门篇 ( 上 )

    作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法. 这个入门篇分上下两篇.本文着重动手,用 mav ...

  9. start: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart:

    用Ubuntu远程登录虚拟host时出现:    start: Unable to connect to Upstart: Failed to connect to socket /com/ubunt ...

  10. 使用code标签获得类似代码段的效果

    几乎所有的浏览器都支持 code标签 code标签, 顾名思义,就是代码标签, imply tell browser, that 后面的部分是表示计算机代码. 因此, 浏览器可以根据自己的特点来显示这 ...