微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个32位整数任意两个比特位交换的宏定义写法


原文出处:
http://blog.chinaunix.net/xmlrpc.PHP?r=blog/article&uid=25272011&id=3658875


今天看到一个很有意思而且很有技巧性的宏定义,和大家分享

#include <stdio.h>

#define bswap(data,m,n)    \
    (data & (1 << m)) == (data & (1 << n)) ? data : data ^ ((1 << m) | (1 << n))

void main(void)
{
    int data = 4;
    
    int m = 2,n = 3;

    //0000 0000 0000 0100
    //exchange bit2 and bit3
    //0000 0000 0000 1000
    //8
    
    printf("%d -> bswap(2,3) -> %d\n",data,bswap(data,n));
}

这个写法的巧妙之处就是利用异或运算来进行所谓的比特位交换,那段宏的大意是,如果两个比特位相同,自然就是返回原始的data,如果两个比特位不同,那么 就是将原来的0变为1,1变为0,那么就可以将该比特位与1异或即可以取反了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐