免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3251 | 回复: 14
打印 上一主题 下一主题

基础不牢问define?【关系位运算】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-05 01:01 |只看该作者 |倒序浏览
下面的这些define具有什么意思,我如何在以后能快速的看懂它,求教大家。特别是对于位运算,每次看书收获很小,请大家赐教



#define    GET_8(p, o)    (p[o])
#define GET_12(p, o)    (((p[o] & 0x0f) << 8) | p[(o)+1])
#define GET_13(p, o)    (((p[o] & 0x1f) << 8) | p[(o)+1])
#define GET_16(p, o)    ((p[o] << 8) | p[(o)+1])
#define GET_24(p, o)    ((p[o] << 16)| (p[(o)+1] << 8) | p[(o)+2])
#define GET_32(p, o)    ((p[o] << 24)| (p[(o)+1] << 16)| (p[(o)+2] << 8) | p[(o)+3])
#define    GET_1(p, o, b)    ((p[o] >> (b)) & 0x01)
#define    GET_2(p, o, b)    ((p[o] >> ((b)-1)) & 0x03)
#define    GET_3(p, o, b)    ((p[o] >> ((b)-2)) & 0x07)
#define    GET_4(p, o, b)    ((p[o] >> ((b)-3)) & 0x0f)
#define    GET_5(p, o, b)    (((p[o] >> ((b)-4))) & 0x1f)
#define    GET_6(p, o, b)    ((p[o] >> ((b)-5)) & 0x3f)
#define    GET_7(p, o, b)    ((p[o] >> ((b)-6)) & 0x7f)


[ 本帖最后由 jiony 于 2007-10-5 01:02 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-10-05 01:24 |只看该作者
看到时能看懂,不过你得给我俩这东西的应用实例啊

论坛徽章:
0
3 [报告]
发表于 2007-10-05 03:43 |只看该作者
前半部分像数值合成(8位数构建16,24...位)。
后半部分像获取指定位的数值。

论坛徽章:
0
4 [报告]
发表于 2007-10-05 09:48 |只看该作者
原帖由 gaocheng 于 2007-10-5 03:43 发表
前半部分像数值合成(8位数构建16,24...位)。
后半部分像获取指定位的数值。



这位大大,是如何看出来的呢?有什么诀窍没有啊?
我一看这个就头晕

论坛徽章:
0
5 [报告]
发表于 2007-10-05 09:55 |只看该作者
p代表数组, o代表数组下标. p应该是一个char数组. 其他也行...关键看具体应用, 但是char的数组可能好些.

从数组上指定下标位置返回指定bit数组成的数值.

先看宏名, GET_n的能猜的差不多, 再看宏定义

论坛徽章:
0
6 [报告]
发表于 2007-10-05 10:26 |只看该作者
原帖由 Edengundam 于 2007-10-5 09:55 发表
p代表数组, o代表数组下标. p应该是一个char数组. 其他也行...关键看具体应用, 但是char的数组可能好些.

从数组上指定下标位置返回指定bit数组成的数值.

先看宏名, GET_n的能猜的差不多, 再看宏定义


#define    GET_8(p, o)    (p[o])--------》这个好懂,关键后面的移位和与或的操作的意思是什么呢》?

论坛徽章:
0
7 [报告]
发表于 2007-10-05 10:39 |只看该作者
原帖由 jiony 于 2007-10-5 10:26 发表


#define    GET_8(p, o)    (p[o])--------》这个好懂,关键后面的移位和与或的操作的意思是什么呢》?



& bitwise AND
| bitwise inclusive OR
<<   left shift
>> right shift

我都不记得哪些书教这些东西了...你的问题是位运算, 数值在计算机的表示方法, 系统原理可能有这些内容...

论坛徽章:
0
8 [报告]
发表于 2007-10-05 10:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2007-10-05 11:25 |只看该作者

回复 #1 jiony 的帖子

都是一些移位操作,在linux下的代码中经常会出现这种,一个简单的测试:

  1. #include<stdio.h>

  2. #define    GET_8(p, o)    (p[o])
  3. #define GET_12(p, o)    (((p[o] & 0x0f) << 8) | p[(o)+1])
  4. #define GET_13(p, o)    (((p[o] & 0x1f) << 8) | p[(o)+1])
  5. #define GET_16(p, o)    ((p[o] << 8) | p[(o)+1])
  6. #define GET_24(p, o)    ((p[o] << 16)| (p[(o)+1] << 8) | p[(o)+2])
  7. #define GET_32(p, o)    ((p[o] << 24)| (p[(o)+1] << 16)| (p[(o)+2] << 8) | p[(o)+3])
  8. #define    GET_1(p, o, b)    ((p[o] >> (b)) & 0x01)
  9. #define    GET_2(p, o, b)    ((p[o] >> ((b)-1)) & 0x03)
  10. #define    GET_3(p, o, b)    ((p[o] >> ((b)-2)) & 0x07)
  11. #define    GET_4(p, o, b)    ((p[o] >> ((b)-3)) & 0x0f)
  12. #define    GET_5(p, o, b)    (((p[o] >> ((b)-4))) & 0x1f)
  13. #define    GET_6(p, o, b)    ((p[o] >> ((b)-5)) & 0x3f)
  14. #define    GET_7(p, o, b)    ((p[o] >> ((b)-6)) & 0x7f)

  15. int main()
  16. {
  17.         char a[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11};
  18.         printf("%d\n",GET_8(a,3));
  19.         printf("%d\n",GET_12(a,3));
  20.         printf("%d\n",GET_13(a,3));
  21.         printf("%d\n",GET_13(a,0x10));

  22.         return 0;
  23. }
复制代码

运行结果:

  1. wangyao@fisherman:~$ ./a.out
  2. 3
  3. 772
  4. 772
  5. 4113
复制代码

论坛徽章:
0
10 [报告]
发表于 2007-10-06 11:30 |只看该作者
感谢以上各位的帮助,但是问题还不是弄得很清楚,个人猜测这些函数是不是某一位或几位的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP