【问题标题】:flags as union of bitset and uint64_t标志为 bitset 和 uint64_t 的联合
【发布时间】:2015-05-28 16:55:55
【问题描述】:

最近学习了 c++ 中的联合,我想出了这个来处理由单个 uint64_t 等表示的多个标志

union myflags_t
{
  uint64_t var;
  std::bitset<64> bits;

  myflags_t() { }
};

我之前使用的另一种方法是bit operations,特别是设置位将第n位更改为x

相反,我可以使用

myflags_t flags;
flags.var = 0;
flags.bits[nth bit] = ...

我的问题是联合或位操作哪个更快?

另外,如果使用联合更快,为什么我以前没有遇到过这个?

编辑: 删除 memset(被误解,不需要它) 我使用 union 的原因是因为稍后在代码中我需要将变量作为 uint64_t 传递 编辑2: 阅读 cmets ,我确信我使用 union 错误。代码创建了未定义的行为,因为联合并不意味着类型双关语。即将结束问题。

【问题讨论】:

  • "如果使用联合更快,为什么我以前没有遇到过?" - 因为它依赖于未定义的行为。
  • @LightnessRacesinOrbit 我应该使用什么来代替 memset?
  • 如果您要使用标准,请使用标准。在这种情况下, bits.reset() 会将存储在位中的所有内容重置为 0。在此示例中添加并集只会使事情变得不那么清晰。不是你的问题的答案,但我没有尝试过。
  • @DisplayName101:您滥用union 来执行无效的类型双关语。这不是union 的用途。这是一个常见的误解。
  • @DisplayName101 正如其他人所说,union 并非旨在在类型之间翻转位。当您只需要其中一种类型时,它旨在节省空间。如果您需要在某些时候使用uint32_t,您可能应该从一开始就使用uint32_t 并坚持下去。您也可以只使用 bitset 并稍后将其转换为 uint32_t

标签: c++ c++11 unions


【解决方案1】:

如果你想翻转第 n 位,你可以这样做。

#include <iostream>
#include <bitset>
#include <cstdint>

int main( void )
{
  uint64_t u64 = 1024;
  std::bitset <64> b64;

  b64 = u64;
  b64.flip(0);

  u64 = b64.to_ulong();

  std::cout << u64 << "\n";

  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2014-10-08
    • 2019-10-24
    相关资源
    最近更新 更多