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

没有进行特别的优化。其实还可以在拷贝源开始位置和目标开始位置是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. 安卓apk与swiper文字版滚动条

    浏览器基础端代码 <!-- Swiper --> <div class="swiper-container"> <div class="sw ...

  2. Robot Framework--13 RFS+AutoItLibrary测试web上传下载

    转自:http://blog.csdn.net/tulituqi/article/details/21888059 Selenium2library在我们实际测试web页面的时候基本上已经够用了,不过 ...

  3. Lua 之string库

    标准string库 基础字符串函数 string.len(s) 返回一个字符串的长度,例如 string.rep(s, n) 返回一个新的字符串,该字符串是参数s重复n次得到的结果,例如 )) -- ...

  4. 浅谈JavaScript中闭包

    引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...

  5. 1.Redis安装(转)

    Redis的官网为: http://redis.io/. 1.Redis安装 redis的安装非常的简单,而且Redis并不依赖其他环境和标准库,很容易上手,这可能也是它流行的一个原因.这里为了测试方 ...

  6. easyui的textbox和validatebox的 赋值区别

    区别代码如下: textbox:$('userId').textbox('setValue','aaa'); validatebox :$('userId').val('aaa');  

  7. linux lsmod命令 及相关信息

    lsmod  (list modules) 语法:lsmod 功能: lsmod命令:是一个小程序,用来显示文件.proc/modules的信息,也就是显示当前内核模块装载的模块. 补充说明: 执行l ...

  8. Memcached存储命令 - add

    Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中. 如果 add 的 key 已经存在,则不会更新数据,之前的值将仍然保持相同,并且您将获得响应 NOT_S ...

  9. oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法

    返回处理后的数据,不同于round()(对数值进行四舍五入处理),该函数不对指定小数前或后的数值部分进行舍入处理. 语法:trunc(number[,decimals]) 其中,number为待做处理 ...

  10. [设计模式] Javascript 之 观察者模式

    观察者模式:定议 定义对象间的一种一对多的关系,当一个对象状态改变时 (一般称为被观察者),依赖于该对象的对象被通知,并更新; 观察者模式:说明 1. 观察者模式是行为模式,也被称为:发布-订阅模式. ...