文档章节

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

乌合之众
 乌合之众
发布于 2015/06/17 11:09
字数 760
阅读 41
收藏 0

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

##说明

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

##代码


include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

//二进制打印输出
void Bp(unsigned char n)  
{  
	int i;
	for (i=7;i>=0;i--)  
	{  
		printf("%u",(n>>i)&1);  
	}
}

//按比特位拷贝
// 从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 -1;
	if(sbb < 0 || ssb < 0 || dbb < 0 || dsb <0)return -2;
	if(nbits==0)return 0;
	
	if(ssb == dsb){
		//边界对其情况
		//1拷贝对齐部分
		int copybyte=(nbits -(8-ssb))/8;
		memmove(dest+dbb+1,src+sbb+1,copybyte);
		//2拷贝前端不完整字节
		if(ssb != 0){
			unsigned char s=src[sbb];
			s &= 0xFF>>ssb;
			dest[dbb] &= 0xFF<<(8-ssb);
			dest[dbb] |= s;
		}
		//拷贝后端不完整字节
		int endbit=(nbits - (8- ssb))%8;
		if(endbit != 0){
			unsigned char s=src[sbb+1+copybyte];
			s &= 0xFF<<(8-endbit);
			dest[dbb+1 + copybyte] &= 0xFF>>endbit;
			dest[dbb+1 + copybyte] |= s;	
		}
		return (8 - endbit);
	}
	//-------------------------------------------------
	
	int sbgb = sbb*8 + ssb;	//源开始的比特位置
	int dbgb = dbb*8 + dsb;	//目标开始比特位置
	int i,ret;
	int k1,m1,k2,m2;
	unsigned char s;
	if(((dest - src)*8+dbgb) < sbgb  ){
		// 目标开始位置在源开始位置左边
		for(i=0;i<nbits;++i){
			//拷贝某个位
			//1、源位置			目标位置
			k1=(sbgb+i)>>3;		k2=(dbgb+i)>>3;
			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-1; i >=0 ;--i){
			//拷贝某个位
			//1、源位置			目标位置
			k1=(sbgb+i)>>3;		k2=(dbgb+i)>>3;
			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 (8 - (dbgb+nbits)%8);
}




int main()
{
	int i;
	unsigned char src[10]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//{0,0x1F,0x0F,0x0F,0x70,0,0,1,1};
	unsigned char dst[10]={0,0,0,0,0,0,0,0,0};

	printf("%d\n",copybits(src,1,3,dst,0,5,24));

	for(i=0;i<10;++i){
		//printf("\t%2x\t%2x\n",src[i],dst[i]);
		Bp(src[i]);
		putchar(' ');
	}
	putchar('\n');
	for(i=0;i<10;++i){
		//printf("\t%2x\t%2x\n",src[i],dst[i]);
		Bp(dst[i]);
		putchar(' ');
	}
	putchar('\n');
	return 0;
}

© 著作权归作者所有

共有 人打赏支持
乌合之众
粉丝 13
博文 90
码字总数 79369
作品 2
海淀
程序员
私信 提问
同步、异步、阻塞和非阻塞的概念

在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。下面是我对这些术语的理解。 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果...

AlphaJay
2010/06/03
0
2
ZIP文件格式详解

ZIP文件的总体格式 分文件头信息+文件压缩数据 中心目录+中心目录记录结束符 1.分文件头信息: 字节数 描述 4 分文件头信息标志(0x04034b50) 2 解压缩所需版本 2 通用比特标志位(置比特0位=加...

壶漏子
2015/10/09
1K
0
兄弟连区块链教程区块链背后的信息安全2DES、3DES加密算法原理一

  区块链教程区块链背后的信息安全2DES、3DES加密算法原理一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期...

兄弟连区块链入门教程
2018/11/09
0
0
Linux 内核数据结构:位图(Bitmap)

本文由伯乐在线 -乔永琪 翻译,唐尤华 校稿。未经许可,禁止转载! 英文出处:0xAX。欢迎加入翻译组。 本系列: 《Linux 内核数据结构:Radix 树》 《Linux 内核数据结构:双向链表》 位图和...

伯乐在线
2016/12/10
0
0
读【深度探索C++对象模型】【中】

【构造和析构函数】 通常我们的看法是:当定义一个类的时候,如果没有为它写一个构造函数,系统将帮我们生成一个,并完成成员的初始化。但是,从编译器来看,上述看法中的两点认识都不够正确...

余二五
2017/11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
11
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
7
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
4
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0
RabbitMQ学习(2)

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时,首先......

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部