标记为位集和uint64\t的并集 最近在C++中学习了有关工会的内容,我提出了这个问题,以便处理由一个UnT64 64 T等表示的多个标志< /P> union myflags_t { uint64_t var; std::bitset<64> bits; myflags_t() { } };

标记为位集和uint64\t的并集 最近在C++中学习了有关工会的内容,我提出了这个问题,以便处理由一个UnT64 64 T等表示的多个标志< /P> union myflags_t { uint64_t var; std::bitset<64> bits; myflags_t() { } };,c++,c++11,unions,C++,C++11,Unions,我的问题是,并集运算和位运算哪个更快? 如果使用工会更快,为什么我以前没有遇到过 编辑: 已删除memset(被误解,不需要它) 我使用union的原因是,在代码的后面部分,我需要将变量作为uint64\t传递 编辑2: 仔细阅读评论,我确信我使用union是错误的。代码创建了未定义的行为,因为联合不是用于类型双关的。将结束问题。如果要翻转第n位,可以这样做 #include <iostream> #include <bitset> #include <cstdin

我的问题是,并集运算和位运算哪个更快?


如果使用工会更快,为什么我以前没有遇到过

编辑: 已删除memset(被误解,不需要它) 我使用union的原因是,在代码的后面部分,我需要将变量作为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;
}
#包括
#包括
#包括
内部主(空)
{
uint64_t u64=1024;
std::位集b64;
b64=u64;
b64.flip(0);
u64=b64.to_ulong();

std::cout“如果使用union更快,为什么我以前没有遇到过?”-因为它依赖于未定义的行为。@LightnessRacesinOrbit我应该使用什么来代替memset?如果要使用std,请使用std。在本例中,bits.reset()将所有以位存储的内容重置为0。在本例中添加union只会使事情变得不那么清楚。这不是对您的问题的回答,但我并不是在试图找到答案。@DisplayName101:您正在滥用union
来执行无效的类型双关。这不是union的目的。这是一个常见的误解。@DisplayName101和其他人一样已经说过,
union
并不是为了在类型之间翻转位而设计的。它是为了在您只需要其中一种类型时节省空间而设计的。如果您需要在某个时候使用
uint32_t
,您可能应该从一开始就使用
uint32_t
并坚持使用它。您也可以使用
位集来转换它稍后转到
uint32\t
#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;
}