
写一个宏,计算结构体中某变量相对于首地址的偏移和写一个宏,可以将一个整数字的奇数位和偶数位交换
发布日期:2021-05-08 03:07:43
浏览次数:12
分类:精选文章
本文共 1068 字,大约阅读时间需要 3 分钟。
写一个宏,可以将一个整数字的奇数位和偶数位交换
分析:
整数那么就是4字节,要把奇数位和偶数位交换, 把当前整数n的基数位左移1位,但是怎么样,能得到整数n的奇数位呢? 那么我们就可以想到&位运算符,0x55555555 => 01010101 01010101… 便(n&0x55555555)<<1 这样便可以得到整数n的奇数位左移1位同理可得:也需要把偶数位右移1位
便(n&0xAAAAAAAA)>>1 这样便可以得到整数n的偶数位右移1位 最后我们再把奇数位左移的结果和偶数位右移的结果用 | 位运算得出最终结果 便:(((n&(0x55555555))<<1)|((n&(0xAAAAAAAA))>>1)) 注意:因为宏定义的,是在预处理阶段,只是文本替换,没有判断运算符的优先级,所以尽量需要加()就一定要加上,不然会出错误 例如 : #define MUL(a,b) ab 如果是MUL(1+1,1+1) -> 1+11+1就等于3//写一个宏,可以将一个整数字的奇数位和偶数位交换//把n的二进制中奇数位和偶数位互换,左边是n的奇数位左移一位,右边是n的偶数位右移一位,两者|,便是最后结果#define CHANGE(n) (((n&(0x55555555))<<1)|((n&(0xAAAAAAAA))>>1))
写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
分析:
A:我们可以知道,结构体变量的地址就是结构体中第一个变量的地址,偏移量为0, B:所以我们如果要求结构体中的变量的偏移量,便可以和结构体变量地址相减即可, C:最后转成char*类型,那便是最后偏移了多少个字节/*structur:结构体变量的地址,也就是首地址 例如结构体变量p,传参传&pvariable:需要求结构体中偏移量的那变量 例如结构体变量p,传参传&p.结构体中某变量名把上面两个地址,强转成char*类型,然后(char*)variable-(char*)structur,便可算出variable的偏移量*/#define OFFSETOF(variable,structur) (((char*)variable)-((char*)structur))
例如:typedef struct Person{char a;int b;double c;}person;//定义一个结构体变量person p;printf("偏移量:%d\n",OFFSETOF(&p.c,&p)) //结构体中c的偏移量为8
发表评论
最新留言
很好
[***.229.124.182]2025年04月02日 21时22分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
动态点击a标签
2021-05-08
@RequestBody和@RequestParam
2021-05-08
oracle创建序列语法
2021-05-08
springboot通过控制层跳转页面404
2021-05-08
idea2020 没有 tomcat server
2021-05-08
jq动态修改元素的onclick属性的值
2021-05-08
为什么讨厌所谓仿生AI的说法
2021-05-08
ORACLE 客户端工具
2021-05-08
Elasticsearch下载慢?分享百度云下载-ELK
2021-05-08
云服务器springboot jar项目开启jmx remote监控-解决无法连接的问题
2021-05-08
文件上传-FileUpload
2021-05-08
快速排序
2021-05-08
Pyinstaller打包的exe文件过大的解决方法
2021-05-08
Linux的软链接跟Windows快捷方式一样?
2021-05-08
更改github的默认语言类型
2021-05-08
修改ubuntu镜像源mirrors为阿里源
2021-05-08
使用bigdecima实例化时传int和string时的精度丢失
2021-05-08
对象转json的时候自动忽略掉某个属性或者方法@JsonIgnore
2021-05-08
使用第三方sdk,微信wechat扫码登录
2021-05-08