问题描述
- 这个断言的意义是什么?
-
int nbuckets;
Assert(nbuckets > 0 && (nbuckets & -nbuckets) == nbuckets);(nbuckets & -nbuckets) == nbuckets的意义是什么?
解决方案
判断是有符号还是无符号
解决方案二:
(nbuckets & -nbuckets) == nbuckets
& 的优先级高于 -,即:(nbuckets & (-nbuckets)) == nbuckets
这是对 nbuckets 与 -nbuckets 进行按位与操作,操作后的结果还要等于 nbuckets。
什么数满足这个要求呢?答案是这个数是:2 的 n 次方,n 从 0 开始,依次:1,2,3,4,...n
解决方案三:
这个问题,主要还是要清楚负数的二进制是如何表示的:正数的二进制,先取反,再加上一。
如果是 10000,先取反为:01111,再加上一等于: 10000,这时再取按位与也就是: 10000。与原数相同!
非 2 的 n 次方,如: 10001,先取反为: 01110,再加上一等于:01111,按位与后不等于数。
以上说明没有考虑高位,因为正数的高位都是零,执行按位与后也是零。
时间: 2024-11-01 02:59:26