社区
C语言
帖子详情
关于一个位运算的算法求助
xysome
2003-07-19 10:29:54
现在有一个位运算的问题请教大家:
从一个文件中读取二进制数据,比如,读取了10字节,存入一个字符数组中;现在,想取出从第3个字节第2位到第5个字节的第7位,并存入一个变量中。
那么请问:
1、如何实现这个算法?
2、这个变量应该声明为什么类型?
...全文
54
12
打赏
收藏
关于一个位运算的算法求助
现在有一个位运算的问题请教大家: 从一个文件中读取二进制数据,比如,读取了10字节,存入一个字符数组中;现在,想取出从第3个字节第2位到第5个字节的第7位,并存入一个变量中。 那么请问: 1、如何实现这个算法? 2、这个变量应该声明为什么类型?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zteliubin
2003-07-19
打赏
举报
回复
re: Polarislee(北极星)
呵呵,没用过bitset,c语言是没有的,我还是喜欢直接操作
也就两3行代码而已嘛!
北极猩猩
2003-07-19
打赏
举报
回复
用bitset岂不是更方便
zteliubin
2003-07-19
打赏
举报
回复
我已经验证了,没有问题,呵呵,给分吧!
main()
{ unsigned char a[10] = { 0x10,0xf0,0x0f,0x0a,0xf0,0x00,0x00,0x00,0x00,0x00};
int n;
memcpy(&n,&a[2],3); //拷贝3,4,5字节
n &= 0x007fffff;//去掉第5字节的8字节
n >>= 1;//去掉第3字节的第1个bit,共保留22bit
unsigned char *p=&a[2];
for(int i=0;i<4;i++) printf("%x ",*p++);
printf("\nn=0x%x\n",n);
p=(unsigned char*)&n;
for(i=0;i<4;i++) printf("%x ",*p++);
printf("\n");
}
运行结果如下:
f a f0 0
n=0x380507
7 5 38 0
说明一下,这是基于x86体系的结果!
zteliubin
2003-07-19
打赏
举报
回复
不好意思,有错误!
我的实现是把第3字节作为int低子介,第5字节作为int高字节,
这样改一下就可以了://假设你说的数字序号从1开始而不是从0开始
char a[10];
int n;
memcpy(&n,&a[2],3); //拷贝3,4,5字节
n &= 0x007fffff;//去掉第5字节的8字节
n>>1;//去掉第3字节的第1个bit,共保留22bit
zteliubin
2003-07-19
打赏
举报
回复
如果包含第2个子节和第7个字节的话,共30bit,因此用int就可以;
实现,要视你的要求,是哪个作为高位,哪个作为低位
一种实现方法:
char a[10];
int n;
memcpy(&n,&a[2],4);
n>>2;
晨星
2003-07-19
打赏
举报
回复
可以保存到bitset对象中。
bigiron
2003-07-19
打赏
举报
回复
不好意思,题目没有看清楚
bigiron
2003-07-19
打赏
举报
回复
这样比较好:
typedef struct __bit{
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
} BITS;
typedef union __Array{
unsigned char abyte;
BITS bits;
} theArray;
theArray myarray[10];
bigiron
2003-07-19
打赏
举报
回复
试试数组的类型是以下这个union看看:
union __a{
unsigned char abyte;
struct __bit{
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
}bit;
}a;
zteliubin
2003-07-19
打赏
举报
回复
那就不是一个普通类型能够表示的,如果一定要的话,那就
定义一个数组来存放:
#define ARRAY_SIZE 10
unsigned char a[ARRAY_SIZE] = { 0x10,0xf0,0x0f,0x0a,0xf0,0x00,0x00,0x00,0x00,0x00};
unsigned char b[ARRAY_SIZE];
for(int i=0;i<ARRAY_SIZE-1;i++)
b[i] = a[i]>>1 | a[i+1]<<7; //每个字节等于本字节的高7个bit与下一个字节0bit拼接
b[i]=a[i] & 0x7f; //处理第10个字节
bugbugbug
2003-07-19
打赏
举报
回复
那只能自定义一个类来处理了。
不过我对你这样作的目的感到有点奇怪!
xysome
2003-07-19
打赏
举报
回复
谢谢!分一定多多的给,呵呵。
但是,最后请教一下:如果我想取出其中从第1个字节第2位到第10个字节的第7位,用int或者long什么的好像都不足以表示了;这时候应该如何处理?
c++小X与
位运算
自从上次小X搞定了完美数之后,他最近在研究一项和计算机密切相关的黑科技。要知道在计算机的内部,数据都是以二进制的形式来进行存储的,而它使用的计算方法也和我们平时的加减乘除四则运算有所不同,它使用的是
位运算
。那什么是
位运算
呢?基础
位运算
有三种符号,分别是and,or,xor(分别对应pascal中的and,or,xor三种运算符号)。以and为例,两个二进制数在做and运算时,分别对两个二进制数的每一位做and运算。
算法
求助
算法
求助
给定一组元素X={x1,x2,…, xn}及其n×n关系矩阵R,其中R_ij=1,当x_i 与x_j 相关联,否则为0,设计
一个
回溯(或分支限界)
算法
,在X中找出两个非空子集A和B,满足:① A∩B=Φ;② A中的每个元素都与B中的所有元素相关联;③B中的每个元素都与A中的所有元素相关联;④A∪B中的元素总数最多。 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdow...
java
算法
例子_java
算法
小例子
作为
一个
程序员,有时候我觉得自己都不适合,因为自己数学不好,
算法
不好,脑子不够灵活。而对于
算法
,感觉就像是数学题,总觉得很难。以前上学,在班里总有几个什么都不好,但唯独数学很厉害,真气人!面对难题时,我只能
求助
,自己想破脑瓜子都想不出什么好的解决办法,都不知道怎么提高这方面的能力。只能慢慢学习了。自己买了本
算法
的书,有空的时候就看看,写一写,总是收获的!下面是几个例子:1.判断闰年public c...
求助
--PTA数据结构与
算法
题目集7-2一元多项式的乘法与加法运算
求助
--PTA数据结构与
算法
题目集7-2一元多项式的乘法与加法运算
模拟退huo
算法
的特点_模拟退火
算法
& BZOJ3680
模拟退火
算法
& BZOJ36800x00 一本正经的胡说八道模拟退火
算法
是个很好玩儿的
算法
,而且打起来也很方便,没有学习这个
算法
之前,我对于搜索的理解大概有以下几种:BFS & DFS分别以栈、队列形式模拟的搜索方式,几乎是所有搜索方式的框架所在,但是一旦搜索扩展状态增多,几乎鲜有可以使用纯暴力搜索实现的情况(DFS在完全扩展状态下是指数级别的复杂度,BFS遇到大的状态爆队列是妥...
C语言
69,368
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章