如何理解这段经典的宏定义?

#definePOW(c)(1<<(c))//2^c
#defineMASK(c)(((unsignedlong)-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、(unsignedlong)-1)和算法思想都可以理解,但是(((unsignedlong)-1)/POW(POW(c))+1))产生的“以2^c位为单位分组,相间的全0和全1”该如何理解呢?(一个全1的无符号数字除以2的2的幂的幂加1,为什么会产生这样相间的二进制结果呢?)
找了一些资料都只有对算法的解释没有对这个宏定义的解释,希望大神解答!~
Thankyou!
慕容3067478
浏览 369回答 2
2回答

LEATH

这个怎么说呢,因为1...n个0...11...n个0...11...n个0...1+1...n个0...1___________________1111111...1111选择2^(2^n)+1是为了能除尽,不会有余数,其实只要是1...n个0...1的这种都可以出现类似的效果
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript