如何检查整数中是否只设置了一位?

博士

我想编写一个函数HasOneBit,即

  • 接受任何整数类型(有符号或无符号的8到64位),
  • constexpr
  • 不调用未定义的行为。

我试图对此概括:

bool HasOneBit (std::uint64_t value)
{
    return value != 0 && (value & (value - 1)) == 0;
}

如果类型为value带符号整数,则会发生下溢,并且我们将最小值传递给了函数。我是否必须重载该功能8次才能实现所有可能?

博士

以下模板函数满足所有条件(实时演示):

template <class T>
constexpr bool HasOneBit (T value)
{
    static_assert (std::is_integral<T>::value && !std::is_same<T, bool>::value,
                   "This function should be used only with integers.");

    const std::make_unsigned_t<T> unsignedValue = value;

    return unsignedValue != 0 && (unsignedValue & (unsignedValue - 1)) == 0;
}

这不会调用未定义的行为,因为value首先会转换为的未签名对应项T此转换不会更改的位表示value

我认为,该标准的相关引用是这样的(请参阅N4713,[conv.integral]#2):

如果目标类型是无符号类型,则结果值是与源整数一致的最小无符号整数(取模2 n,其中n是用于表示无符号类型的位数)。[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断)。—尾注]

本规则的较新版本就更简单了。不确定,这是否也适用于从无符号到有符号的转换。

否则,结果是目标类型的唯一值,该唯一值与源整数模2 N一致,其中N是目标类型的宽度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何确定是否在VHDL中设置了STD_LOGIC_VECTOR中的一位以上

来自分类Dev

如何检查是否在 MySQL 中设置了位

来自分类Dev

如何集体检查是否在无符号整数中设置了位?

来自分类Dev

如何测试3位总线的第一位是否设置为1-Verilog

来自分类Dev

如何测试整数的第一位数字是否为7?

来自分类Dev

如何比较列表中连续整数的最后一位数字?

来自分类Dev

如何对整数中的一位数进行运算

来自分类Dev

如何检查TarArchiveEntry是否设置了3个执行位中的任何一个?

来自分类Dev

检查SQL中十六进制的最后一位

来自分类Dev

在int(Java)中检查一位数字

来自分类Dev

检查Ansible剧本中数字的第一位

来自分类Dev

在int(Java)中检查一位数字

来自分类Dev

如何在C ++中交换数字的第一位和最后一位

来自分类Dev

如何在C ++中交换数字的第一位和最后一位

来自分类Dev

检查是否在DWORD中设置了某些位

来自分类Dev

如何左移一位?

来自分类Dev

逐渐打印整数的最后一位?

来自分类Dev

如何在SQL中替换数字中的一位?

来自分类Dev

每个组织如何只返回一位联系人?

来自分类Dev

如何在分数系统中添加一位小数

来自分类Dev

是否可以将0作为整数变量的第一位存储

来自分类Dev

Java检查int的下一位数字是否等于当前数字

来自分类Dev

插入只存储第一位,余数被忽略

来自分类Dev

哪个一位整数的有效位更高?

来自分类Dev

是否可以将一位的位向量转换为SMTLib2中的布尔变量?

来自分类Dev

检查模具位,然后写入另一位

来自分类Dev

检查两个字符串是否在两个不同的数组中但在同一位置

来自分类Dev

使用for循环遍历列表,检查是否存在字符。如果存在,将角色放在同一位置的新列表中

来自分类Dev

从整数中删除最后一位数字,并在python中放入零

Related 相关文章

  1. 1

    如何确定是否在VHDL中设置了STD_LOGIC_VECTOR中的一位以上

  2. 2

    如何检查是否在 MySQL 中设置了位

  3. 3

    如何集体检查是否在无符号整数中设置了位?

  4. 4

    如何测试3位总线的第一位是否设置为1-Verilog

  5. 5

    如何测试整数的第一位数字是否为7?

  6. 6

    如何比较列表中连续整数的最后一位数字?

  7. 7

    如何对整数中的一位数进行运算

  8. 8

    如何检查TarArchiveEntry是否设置了3个执行位中的任何一个?

  9. 9

    检查SQL中十六进制的最后一位

  10. 10

    在int(Java)中检查一位数字

  11. 11

    检查Ansible剧本中数字的第一位

  12. 12

    在int(Java)中检查一位数字

  13. 13

    如何在C ++中交换数字的第一位和最后一位

  14. 14

    如何在C ++中交换数字的第一位和最后一位

  15. 15

    检查是否在DWORD中设置了某些位

  16. 16

    如何左移一位?

  17. 17

    逐渐打印整数的最后一位?

  18. 18

    如何在SQL中替换数字中的一位?

  19. 19

    每个组织如何只返回一位联系人?

  20. 20

    如何在分数系统中添加一位小数

  21. 21

    是否可以将0作为整数变量的第一位存储

  22. 22

    Java检查int的下一位数字是否等于当前数字

  23. 23

    插入只存储第一位,余数被忽略

  24. 24

    哪个一位整数的有效位更高?

  25. 25

    是否可以将一位的位向量转换为SMTLib2中的布尔变量?

  26. 26

    检查模具位,然后写入另一位

  27. 27

    检查两个字符串是否在两个不同的数组中但在同一位置

  28. 28

    使用for循环遍历列表,检查是否存在字符。如果存在,将角色放在同一位置的新列表中

  29. 29

    从整数中删除最后一位数字,并在python中放入零

热门标签

归档