C++ 从C+中的位表示初始化字符+;

C++ 从C+中的位表示初始化字符+;,c++,bit-manipulation,mpi,bit,std-bitset,C++,Bit Manipulation,Mpi,Bit,Std Bitset,我有一条包含唯一id的消息,以及一些需要通过MPI进程发送的信息。为此,我将此消息转换为一个位数组 我使用类将一条消息转换为位表示。现在,我想用MPI将它发送到另一个进程 我可以使用该函数将每个位转换为一个字符;但是消息的大小将增加到sizeof(char)*MSG_size(在我的例子中,MSG_size等于256) static const int MSG_SIZE=256; std::位集msg; msg=将_转换为_位(uint64_t uid,{附加信息…}); //使用函数to_st

我有一条包含唯一id的消息,以及一些需要通过MPI进程发送的信息。为此,我将此消息转换为一个位数组

我使用类将一条消息转换为位表示。现在,我想用MPI将它发送到另一个进程

我可以使用该函数将每个位转换为一个字符;但是消息的大小将增加到sizeof(char)*MSG_size(在我的例子中,MSG_size等于256)

static const int MSG_SIZE=256;
std::位集msg;
msg=将_转换为_位(uint64_t uid,{附加信息…});
//使用函数to_string(),我的消息现在的大小为(MSG_size*sizeof(char))
//因为位集中的每一位都由一个字符(=32位)表示
MPI_发送(msg.to_string().c_str(),msg.to_string().size(),MPI_字节,1,0,MPI_COMM_WORLD);
如何避免这种情况,将消息大小保持为256位

事实上,我希望出现这样的情况:

static const int MSG_SIZE = 256;
std::bitset<MSG_SIZE> msg;
msg = convert_to_bit(uint64_t uid, {additional information...});
// not necessary represented using char
// However I have no idea about which type I have to use
char* msg_in_bits = new char[MSG_SIZE / sizeof(char)];
msg_in_bits = do_something(msg);
MPI_Send(msg_in_bits, MSG_SIZE, MPI_BYTE, 1, 0, MPI_COMM_WORLD);
static const int MSG_SIZE=256;
std::位集msg;
msg=将_转换为_位(uint64_t uid,{附加信息…});
//不需要使用char表示
//然而,我不知道我必须使用哪种类型
char*msg_in_bits=新字符[msg_SIZE/sizeof(char)];
msg_in_bits=做某事(msg);
MPI_发送(消息位、消息大小、MPI_字节、1、0、MPI_通信世界);
我只想发送一条消息的实际大小:MSG_size=256位。 不要增加消息的大小,因为我将用字符(=32位)表示每一位。我想代表一点。。。一点点,而不是一个字符


谢谢你这样做,不是唯一的方法

#include <cstdint>

static const int MSG_SIZE = 256;
static const int MSG_SIZE_IN_BYTES = MSG_SIZE/8;
std::bitset<MSG_SIZE> msg = ...;
uint8_t msg_in_bits[MSG_SIZE_IN_BYTES] = {0};
for (int i = 0; i < MSG_SIZE; ++i)
    if (msg[i])
        msg_in_bits[i/8] |= 1 << (i%8);
MPI_Send(msg_in_bits, MSG_SIZE_IN_BYTES, MPI_BYTE, 1, 0, MPI_COMM_WORLD);
#包括
静态常量int MSG_SIZE=256;
静态常量int MSG_SIZE_(以字节为单位)=MSG_SIZE/8;
std::bitset msg=。。。;
uint8_t msg_in_bits[msg_SIZE_in_BYTES]={0};
对于(int i=0;imsg_in_bits[i/8]|=1如果您只想用mpi发送
std::string msg
,我会这样做

MPI_Send(msg.c_str(), msg.size(), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
我认为这不太容易出错,也不比您的方法慢


你有什么理由想先转换它吗?

不清楚你在问什么。请你的帖子澄清一下。你有一条256位大小的消息,当你做一些对流时,大小会增加,但你不希望大小增加。。。不做转换怎么样?也许一些代码有助于理解您正在做什么…@AdrienRoussel您的示例代码中似乎有很多关于大小的混淆
sizeof(char)
是1而不是8,MPI_Send的第二个参数是字节大小而不是位。我使用std::bitset类将一条消息转换为位表示。为什么?怎么用?一个字符由8位组成(通常)。如果只使用一个子集字符,那么更少的位也就足够了。(你不知道。)我的第一个想法是,
MPI_Send()
可能需要它,但你发送
MSG_SIZE*sizeof(char),MPI_字节
,即256字节。这在某种程度上是令人困惑的…您希望发送一个字节数组,每个字节包含8位(或字符位)的信息。不幸的是,
std::bitset
不支持转换为这种表示。我的建议是避免使用此应用程序的
std::bitset
。使用
std::array
(计算所需的大小)并自己提供与消息之间的转换。您认为直接经过uint8\t数组而不是经过位集类然后将其转换为此表示形式更明智吗?以最方便的表示形式为准。在不了解你的应用程序的情况下,我真的不能说。事实上,我的消息包含消息类型(4位)、唯一标识符(64位)、粒度大小(16位)和函数名(172位)。我想把所有这些信息转换成比特,然后通过MPI发送。首先,我使用std::bitset,因为它对我来说很容易使用。但是为了安全起见,使用uint8\u t代替
MSG\u SIZE/8
==>
(MSG\u SIZE+7)/8
可能更合理。如何存储函数名?172甚至不能被8整除。只有在使用位时,使用位集才有意义。在这里,所有的数据字段都比单个位大得多,因此处理单个位会更慢,并且由于内存空间和通信速度的原因,会产生更多的错误。我不想花太多的时间发送比我使用的更多的比特。对不起。我不明白为什么发送的比使用的多。当我使用函数将我的位数组从位集转换为_string()时,每个位都表示为一个字符(sizeof(char)=32位)。因此,消息的大小是(MSG_size*32位),而不是MSG_sizebits@AdrienRoussel
sizeof(char)
为1,其中包含
char\u位
位(通常为8位)
MPI_Send(msg.c_str(), msg.size(), MPI_CHAR, 0, 0, MPI_COMM_WORLD);