标志为bitset和uint64_t的联合

flags as union of bitset and uint64_t

本文关键字:uint64 bitset 标志      更新时间:2023-10-16

最近了解了c++中的联合,我想出了这个方法,以便处理由单个uint64_t表示的多个标志,等等

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

我之前使用的另一种方法是位操作,特别是设置位将第n位更改为x。我可以用

代替

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

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

如果使用联合更快,为什么我以前没有遇到过这种情况?

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

如果你想翻转第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;
}