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

没有进行特别的优化。其实还可以在拷贝源开始位置和目标开始位置是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. sql编程小结

    对照mysql5.1手册,对这几天学的sql编程进行小结,主要涉及触发器.存储过程.权限管理.主从分离等,权当抛砖引玉,高手请略过. 一.触发器 通俗的说就是在指定的数据表增删改的前或后触发执行特定的 ...

  2. angularjs笔记(三)

    AngularJS API 7.其他一些常用指令,布尔类型的指令也可以用表达式 (1).数组索引$index <!DOCTYPE html> <html> <head&g ...

  3. css教程

    网址:http://www.aa25.cn/layout/index.shtml

  4. NopCommerce Url分析

    using System; using System.Web; using System.Web.Routing; using Nop.Core; using Nop.Core.Data; using ...

  5. git之https或http方式设置记住用户名和密码的方法

    https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速 设置记住密码(默认15分钟): git config --global credenti ...

  6. Python之路【番外篇】回顾&类的静态字段

    回顾 回顾:字符串.列表.字典的修改关于内存的情况 一.字符串 str1 = 'luotianshuai' str2 = str1 print id(str1) print id(str2) prin ...

  7. Python开发【第四篇】:Python基础之函数

    三元运算 三元运算(三目运算),是对简单的条件语句的缩写. ? 1 2 3 4 5 # 书写格式   result = 值1 if 条件 else 值2   # 如果条件成立,那么将 “值1” 赋值给 ...

  8. 并发下常见的加锁及锁的PHP具体实现代码(转)

    在最近的项目中有这样的场景 1.生成文件的时候,由于多用户都有权限进行生成,防止并发下,导致生成的结果出现错误,需要对生成的过程进行加锁,只容许一个用户在一个时间内进行操作,这个时候就需要用到锁了,将 ...

  9. [git]添加项目到git

    写在前面 一直在想把代码托管到git上面,一直没有去研究,最近发现自己写的demo,好多都找不到了,实在是没办法了,耐下心研究了下git.这里通过添加了自己做的demo,算是也是学习下git的操作吧. ...

  10. 后缀.jar的是什么文件?

    解压kafka 打开后是一堆.jar结尾的文件,那么后缀.jar的是什么文件? JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种 ...