个人笔记:计算块设备块大小的log2函数值

#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后面必然有160((x & 0xff00ff00) ? 8 : 0)
分治思想,把x的二进制分为两组(0xff00 0xff00)。
计算每组的高8(0xff00)。
如果有1,那么1后面必然有80((x & 0xf0f0f0f0) ? 4 : 0)
分治思想,把x的二进制分为四组(0xf0 0xf0 0xf0 0xf0)
计算x每组的高4(0xf0)。
如果有1,那么1后面必然有40((x & 0xcccccccc) ? 2 : 0)
分治思想,把x的二进制分为八组(0xc 0xc 0xc 0xc 0xc 0xc 0xc 0xc)
0xc二进制1100b
计算x每组的高2(1100b)。
如果有1,那么1后面必然有20(((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后面有10。

全部相加就是x二进制1后面0的个数(=n)。
也就是2的n次方。log2(x)=n
个人理解,如果错误,请指出。

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值