- 论坛徽章:
- 0
|
回复 #1 jiony 的帖子
都是一些移位操作,在linux下的代码中经常会出现这种,一个简单的测试:
- #include<stdio.h>
- #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)
- int main()
- {
- char a[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11};
- printf("%d\n",GET_8(a,3));
- printf("%d\n",GET_12(a,3));
- printf("%d\n",GET_13(a,3));
- printf("%d\n",GET_13(a,0x10));
- return 0;
- }
复制代码
运行结果:
- wangyao@fisherman:~$ ./a.out
- 3
- 772
- 772
- 4113
复制代码 |
|