当前位置: 首页 > 知识库问答 >
问题:

为什么std::bit_width值为0返回0,难道不应该返回1吗?

阴波峻
2023-03-14

std::bit_width查找表示整数x1+楼层(log(x))所需的最小位

为什么std::bit_width为值0返回0,难道不应该返回1吗。因为表示0所需的位数是1。

另外,我认为公式中的1是一个偏移量

共有1个答案

解晟睿
2023-03-14

bit_width有一段奇怪的历史。

最终被称为bit_width的函数作为log2开始使用,这是添加整数二次方函数建议的一部分。log2被指定为在传递|0时生成UB。

因为这就是对数的工作原理。

但后来,事情发生了变化。该函数后来变成了log2p1,并且由于未指定的原因,给出了一个更宽的契约(在C++术语中,“宽契约”意味着更多的东西被视为有效输入)。具体地说,0是有效输入,并产生0的值。

这不是对数的工作原理,但不管怎样。

当C++20接近标准化时,发现了名称冲突(PDF)。名称log2p1恰好对应于IEEE-754算法的名称,但这是一个完全不同的算法。此外,其他语言中具有类似输入和结果的函数使用类似于bit_lengt的名称。因此它被重命名为bit_width

因为它不再是假装做对数了,所以0的行为可以是我们想要的。

实际上,Python函数int.bit_lengt具有完全相同的行为。由于0的值包含所有的前导零,所以前导零不被视为位长度的一部分...

 类似资料:
  • 当某个对象具有装箱类型属性时,该属性的getter返回。但是这应该返回,因为boxed type属性的默认值是。这里有什么问题?

  • 我知道(-0==0)是真的。我很想知道为什么-0 当我在stackoverflow执行上下文中运行这段代码时,它返回。 但是当我在浏览器控制台中运行相同的代码时,它返回。那是为什么呢?我试图在谷歌上搜索它,但没有找到任何有用的东西。这个问题可能不会给某个人的实际例子增加价值,我想了解JS是如何计算它的。

  • 问题内容: 我有这样的事情: 而且我总是得到“时钟周期为:0-0”的输出 知道为什么会这样吗? (仅给出一点点细节,something_else()函数使用蒙哥马利表示法执行从左到右的求幂运算,而且我不确定不确定something_else()函数确实花费了一些不可忽略的时间。) 这是在Linux上。uname -a的结果是: 问题答案: 该功能不测量CPU时钟周期。 C说: “ 从实现定义的仅与

  • 问题内容: 为什么以下返回0? 问题答案: 月份从0(一月)到11(十二月)进行编号。 参考:

  • 我通过这个简单的演示来再现这个问题: -o0编译并运行:

  • 问题内容: 我有以下代码。应该返回表的最后一行的mysqli_insert_id()(在本例中为“ $ last_row”)始终返回0。为什么会这样呢? 问题答案: 并 没有 返回表的最后一排的ID。从文档中,它: …返回由查询产生的ID,该查询是对具有具有AUTO_INCREMENT属性的列的表进行的。如果最后一个查询不是or 语句,或者如果修改后的表没有带有属性的列,则此函数 将返回零 。 (