| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1128 人关注过本帖
标题:一个关于位运算的宏定义求解
只看楼主 加入收藏
liyachen777
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-7-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
一个关于位运算的宏定义求解
我们大一学生在做课程设计,我在网上找的一个程序中的一个宏定义在答辩时被老师提问道,我不会······求各位大神解答!!!
#define MCGETLONG(data)  ( ( ((unsigned long)MCGETSHORT((data)))<<16 )|( ((unsigned long)MCGETSHORT((char *)(data)+2))&0x0000ffff ) )
老师还举了个例子
a=1b2ec
b=MCGETLONG(a)
问b得多少
大家给解答下,还有原理是什么,能不能提前回家全看大家了,谢谢啦!!!!!!!!!!
搜索更多相关主题的帖子: 大一学生 课程 网上 
2014-07-24 16:38
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:7 
MCGETSHORT()。这个宏怎么定义的?
2014-07-24 16:58
liyachen777
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-7-24
收藏
得分:0 
回复 2 楼 pangshch
额········我把源文件给你····
aa.rar (5.2 KB)
2014-07-24 17:01
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
MCGETSHORT(data) 这个宏定义涉及到把data的值转换为char 指针, 再取地址的值,
 所以你老师给的例子:
a = 0x1b2ec;
这个程序对地址非法访问了,会产生错误, 就算可以访问, 里面的值也是未知的, 计算出来的值也是未知的。
2014-07-24 17:26
funyh250
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:26
帖 子:290
专家分:1573
注 册:2013-12-25
收藏
得分:7 
#define MCGETCHAR(data)  (*((char *)(data)))
                       
#define MCGETSHORT(data)  ((unsigned short)(( ((unsigned short)(*((char *)(data))))<<8 )|( ((unsigned short)(*((char *)(data)+1)))&0x00ff )))
       如果16位  高8位为(*((char *)(data)))  低8位为(*((char *)(data)+1))
#define MCGETLONG(data)  ( ( ((unsigned long)MCGETSHORT((data)))<<16 )|( ((unsigned long)MCGETSHORT((char *)(data)+2))&0x0000ffff ) )
       如果32位  高16位为MCGETSHORT(data)          低8位为*(char *)(data)+2) 貌似少了个*号
#define MCGET3BN(data)  ( ( ((unsigned long)MCGETCHAR((data)))<<16 )|( ((unsigned long)MCGETSHORT((char *)(data)+1))&0x0000ffff ) )
        32位   高16位中低8位为*((char *)(data))  低16中低8位为*(char *)(data)+1)

#define Length 655350


不知这样理解对否

[ 本帖最后由 funyh250 于 2014-7-24 19:26 编辑 ]

学习是大事   吃喝拉撒睡是小事   其他的那都不是事
2014-07-24 19:06
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:7 
就是颠倒一下字节顺序,比如 0x11223344 变为 0x44332211

最大的问题是参数不该用 指针
,这效率损失太大了

另外,这算法也不高效,比如 a,b,c,d 四个字节
你老师是 先颠倒a/b,再颠倒c/d,最后颠倒ba/dc,需要颠倒3次
如果是我写代码的话,前两步可以一起做掉,即 (abcd左移8位再&0xFF00FF00) | (abcd右移8位再&0x00FF00FF)

我写个demo给你
程序代码:
[color=#0000FF]#include <inttypes.h>

uint32_t Reverse( uint32_t n )
{
    n = ((n<<8)&0xFF00FF00) | ((n>>8)&0x00FF00FF);
    return (n<<16) | (n>>16);
}

#include <stdio.h>

int main()
{
    printf( "%08"PRIX32" %08"PRIX32"\n", 0x11223344, Reverse(0x11223344) );

    return 0;
}

[/color]
2014-07-25 11:17
快速回复:一个关于位运算的宏定义求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026769 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved