mask(n)
,给定一个数字n
,返回其最低位的n
个设置为1的无符号整数。虽然这似乎应该是一个基本的原语,有着大量讨论的实现,可以高效地编译 - 但事实并非如此。
当然,不同的实现可能对于像unsigned int
这样的原始整型类型具有不同的大小,因此为了具体起见,我们假设特别返回一个uint64_t
,尽管当然可接受的解决方案将针对任何无符号整型类型(具有不同的定义)工作。特别是当返回的类型等于或小于平台的本机宽度时,解决方案应该是有效的。
至关重要的是,这必须适用于[0,64]中的所有n
。特别是mask(0) == 0
和mask(64) == (uint64_t)-1
。许多“显而易见”的解决方案对这两种情况之一不起作用。
最重要的标准是正确性:只有不依赖于未定义行为的正确解决方案才有趣。
其次是性能:理想情况下,该成语应该编译为在常见平台上以大约最有效的平台特定方式执行此操作的方式。
为了性能而牺牲简单性(例如,在不同的平台上使用不同的实现)的解决方案也可以接受。
1 最一般的情况是函数,但理想情况下它也应该作为一个宏工作,而不会重新评估任何参数超过一次。