c++ - 如何理解这段经典的宏定义?
天蓬老师
天蓬老师 2017-04-17 11:54:20
[C++讨论组]
#define POW(c) (1 << (c))  //2^c
#define MASK(c) (((unsigned long) -1) / POW(POW(c)) + 1)) //以2^c位为单位分组,相间的全0和全1
// MASK(0) = 55555555(h) = 01010101010101010101010101010101(b)
// MASK(1) = 33333333(h) = 00110011001100110011001100110011(b)
// MASK(2) = 0f0f0f0f(h) = 00001111000011110000111100001111(b)
// MASK(3) = 00ff00ff(h) = 00000000111111110000000011111111(b)
// MASK(4) = 0000ffff(h) = 00000000000000001111111111111111(b)

这是“求二进制中数位1的个数”( see: http://www.cnblogs.com/kaikai/archive/2006/02/15/330901.html)平行算法中经典的宏定义,POW 、 (unsigned long) -1) 和 算法思想 都可以理解,但是 (((unsigned long) -1) / POW(POW(c)) + 1)) 产生的“以2^c位为单位分组,相间的全0和全1”该如何理解呢?(一个全1的无符号数字除以2的2的幂的幂加1,为什么会产生这样相间的二进制结果呢?)

找了一些资料都只有对算法的解释没有对这个宏定义的解释,希望大神解答!~

Thank you!

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
伊谢尔伦

自问自答一下。
知乎上的提问的回答:http://www.zhihu.com/question/30045208
注意所有的数都是二进制,大概与二进制的加法与乘法有关,实际上跟十进制的运算规则是类似的。
这一点需要深入理解。

再推荐一本最近闲看的书:《编码的奥秘》,里面有对进制深入浅出的探讨。

阿神

这个怎么说呢,因为

      1...n个0...1
     1...n个0...1
    1...n个0...1
 + 1...n个0...1
___________________
   1111111... 1111

选择2^(2^n)+1是为了能除尽,不会有余数,其实只要是 1...n个0...1的这种都可以出现类似的效果

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号