【发布时间】:2021-07-12 15:53:03
【问题描述】:
std::bit_width 找到将整数 x 表示为 1+floor(log(x)) 所需的最小位数
为什么std::bit_width 为值 0 返回 0?它不应该返回 1,因为表示 0 所需的位数是 1?
另外,我认为公式中的1 是一个偏移量。
【问题讨论】:
-
标准明确规定了这种行为,但没有给出任何动机。
-
为什么要返回1?如果你想持有零个苹果,你需要零个篮子,不是吗?因此,例如,如果您要将数据存储为长度和指向可变长度缓冲区的指针,您甚至根本不需要使用任何缓冲区来表示零,因为您的长度将从零开始。
-
从另一个角度来看也是合乎逻辑的:它返回从右边开始的最高值 1 位的位置,从 1 开始,所以 0 表示根本没有 1 位。或者,从另一个角度来看:2^0=1,所以一个 0 位长的数字可以正好代表 1 个状态:零。因此,零位足以表示数字零。
-
@rohitt:是的,您需要长度为零,但这与必须存储长度或提前知道最大可能长度没有什么不同。如果要表示数字 5,则需要 3 位,但您还需要以某种方式记住您需要 3 位,否则当它们进入位流时,您无法将数字 5 与包括更多位的更大数字区分开来。零也没有什么不同,你需要 0 位来存储它,但你仍然需要存储或以某种方式记住你需要读/写多少 - 在这种情况下什么都没有。
-
我们真的不需要一个数字来表示零。只有在我们需要检测数字存在的人类可读句子中才需要使用一位数字表示零。否则,当我们已经知道那里有一个数字时,空的数字序列是零的完美表示,这也更规则。尝试编写一个算法来将自然值转换为可变长度的位字符串,反之亦然:如果我们将零表示为空字符串,它会更容易。事实上,当我们需要一位零时,我们需要为此实现一个特殊情况。