从 C++ 中的位表示初始化 char
Initialization of a char from bit representation in C++
我有一条包含唯一 ID 的消息,以及一些我需要通过 MPI 进程发送的信息。为此,我将此消息转换为一个位数组。
我使用 std::bitset class 将一条消息转换为位表示。现在,我想用 MPI 将它发送到另一个进程。
我可以使用函数std::bitset::to_string()将每个位转换为一个字符;但消息的大小将增加到 sizeof(char)*MSG_SIZE(在我的例子中 MSG_SIZE 等于 256)。
static const int MSG_SIZE = 256;
std::bitset<MSG_SIZE> msg;
msg = convert_to_bit(uint64_t uid, {additional information...});
// Using the function to_string(), my message is now of size (MSG_SIZE * sizeof(char))
// because each bit in the bitset is represented by a char (= 32 bits)
MPI_Send(msg.to_string().c_str(), msg.to_string().size(), MPI_BYTE, 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);
我只想发送消息的实际大小: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);
如果你只想用 mpi 发送 std::string msg
,我会这样做
MPI_Send(msg.c_str(), msg.size(), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
我认为这比您的方法更不容易出错,而且速度也不慢。
你喜欢先转换它的原因是什么?
我有一条包含唯一 ID 的消息,以及一些我需要通过 MPI 进程发送的信息。为此,我将此消息转换为一个位数组。
我使用 std::bitset class 将一条消息转换为位表示。现在,我想用 MPI 将它发送到另一个进程。
我可以使用函数std::bitset::to_string()将每个位转换为一个字符;但消息的大小将增加到 sizeof(char)*MSG_SIZE(在我的例子中 MSG_SIZE 等于 256)。
static const int MSG_SIZE = 256;
std::bitset<MSG_SIZE> msg;
msg = convert_to_bit(uint64_t uid, {additional information...});
// Using the function to_string(), my message is now of size (MSG_SIZE * sizeof(char))
// because each bit in the bitset is represented by a char (= 32 bits)
MPI_Send(msg.to_string().c_str(), msg.to_string().size(), MPI_BYTE, 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);
我只想发送消息的实际大小: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);
如果你只想用 mpi 发送 std::string msg
,我会这样做
MPI_Send(msg.c_str(), msg.size(), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
我认为这比您的方法更不容易出错,而且速度也不慢。
你喜欢先转换它的原因是什么?