写一个宏,计算结构体中某变量相对于首地址的偏移和写一个宏,可以将一个整数字的奇数位和偶数位交换

写一个宏,可以将一个整数字的奇数位和偶数位交换

分析:
整数那么就是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+1
1+1就等于3

//写一个宏,可以将一个整数字的奇数位和偶数位交换
//把n的二进制中奇数位和偶数位互换,左边是n的奇数位左移一位,右边是n的偶数位右移一位,两者|,便是最后结果
#

你可能感兴趣的:(c语言,案例,项目开发)