#define LOG2(x) (((x & 0xaaaaaaaa) ? 1 : 0) + ((x & 0xcccccccc) ? 2 : 0) + \
((x & 0xf0f0f0f0) ? 4 : 0) + ((x & 0xff00ff00) ? 8 : 0) + \
((x & 0xffff0000) ? 16 : 0))
mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz);
块设备的块大小是512字节(Bytes)的倍数,也就是2的n次方。所以只要计算块大小二进制1后面有多少个0就可以了。
((x & 0xffff0000) ? 16 : 0))
如果x高16位有1,那么1后面必然有16个0。
((x & 0xff00ff00) ? 8 : 0)
分治思想,把x的二进制分为两组(0xff00 0xff00)。
计算每组的高8位(0xff00)。
如果有1,那么1后面必然有8个0。
((x & 0xf0f0f0f0) ? 4 : 0)
分治思想,把x的二进制分为四组(0xf0 0xf0 0xf0 0xf0)
计算x每组的高4位(0xf0)。
如果有1,那么1后面必然有4个0。
((x & 0xcccccccc) ? 2 : 0)
分治思想,把x的二进制分为八组(0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc)
0xc二进制1100b
计算x每组的高2位(1100b)。
如果有1,那么1后面必然有2个0。
(((x & 0xaaaaaaaa) ? 1 : 0)
0xa二进制1010b
分治思想,把x的二进制分为十六组(10b 10b 10b 10b 10b 10b 10b 10b 10b 10b 10b 10b 10b 10b 10b 10b)
计算x每组的高1位(10b)。
如果有1,那么1后面有1个0。
全部相加就是x二进制1后面0的个数(=n)。
也就是2的n次方。log2(x)=n
个人理解,如果错误,请指出。