社区
C语言
帖子详情
关于一个位运算的算法求助
xysome
2003-07-19 10:29:54
现在有一个位运算的问题请教大家:
从一个文件中读取二进制数据,比如,读取了10字节,存入一个字符数组中;现在,想取出从第3个字节第2位到第5个字节的第7位,并存入一个变量中。
那么请问:
1、如何实现这个算法?
2、这个变量应该声明为什么类型?
...全文
84
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...
matlab
算法
每次都不同,
求助
为什么同
一个
粒子群
算法
程序每次运行的结果都不一样...
该楼层疑似违规已被系统折叠隐藏此楼查看此楼做的
一个
粒子群削峰填谷的程序,每次的运行的结果都不一样,clear工作区以后也是,matlab小白完全不懂,求大神指出哪里不正确,万分的感谢下面是粒子群的程序clear all;clc;format long;%------给定初始化条件----------------------------------------------c1=1.4962; ...
DES加密
算法
des
算法
求助
编辑百科名片 DES
算法
DES
算法
为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密
算法
。 明文按64位进行分组, 密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位
打卡信奥刷题(254)用C++信奥P1952[普及组/提高] 火星上的加法运算
最近欢欢看到一本有关火星的书籍,其中她被
一个
加法运算所困惑,由于她的运算水平有限.她想向你
求助
,作为一位优秀的程序员,你当然不会拒绝。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章