模拟实现offsetof宏以及交换整数的奇偶位

一、模拟实现offsetof宏

offsetof (type,member)是用来计算结构体中成员偏移量的宏。
设计宏参数:结构体名,结构体成员名
内部实现:将0强制类型转化为这个结构体的类型的地址,这就相当于在0地址处存放了一个结构体,再找到0地址处结构体内成员的地址,这个成员的地址就是这个成员偏移量的大小。

//offsetof宏实现

#define OFFSETOF(type,member) (int)&(((type*)0)->member)
struct S
{
	char c1;
	int a;
	char c2;
};
int main()
{
	printf("%d\n", OFFSETOF(struct S,c1));
	printf("%d\n", OFFSETOF(struct S, a));
	printf("%d\n", OFFSETOF(struct S, c2));
	return 0;
}

二、写一个宏交换奇偶位

在计算机中每一个整数都可以用32个0或1来表示,要交换一个数的奇偶位,则必须要分别保存它的奇偶位然后再进行交换才可。
那么要如何分别保存奇偶位呢,请看下面的内容。
1.保存奇数位
0xaaaaaaaa = 10101010101010101010101010101010
我们用这个数 & 0xaaaaaaaa就可以得到这个数的所有偶数位,且奇数位位0,因为&的特点是两个二进制位都为1才为1,否则为0。然后再将其算术右移一位,左边补一个0,偶数位就到达奇数位上了。
2.保存偶数位
0x55555555 = 01010101010101010101010101010101
我们用这个数 &0x55555555就可以得到这个数的所有奇数位,且偶数位位0,再将其算术左移一位,右边补0,则奇数位就到达偶数位了。
完成这两步后相加就是交换奇偶位后的结果了。

#define  ODD_TO_EVEN(x) (((x&0xAAAAAAAA)>>1)+((x&0x55555555)<<1))
int main()
{
	int x = 10;
	int y = ODD_TO_EVEN(x);
	printf("%d\n", y);
	return 0;
}

以上就是今天的内容了,希望对大家有所帮助。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值