我在C中有一个程序,它使用MPI在进程之间发送(x,y,z)轴中特定点的坐标。因为发送的点是连续的类型(2d数组的行) )我想编码存储在结构
中的坐标 Struct pnts{
int x;
int y;
int z;
}pnt;
在一个数字( INTEGER / FLOAT )中,我需要对这三个坐标进行编码 坐标是区间[0,2 8 ]中的整数 例如: x = 16, y = 2, z = 4,相对于 x < y < z
有什么想法吗?
答案 0 :(得分:0)
这是一件非常简单的事情,你需要在一个允许4位的32位整数中编码3个字节。所以你需要的是
int32_t coordinates;
coordinates = x | (y << 8) | (z << 16);
然后您可以使用位标志掩码访问坐标。
测试程序:
#include <stdint.h>
#include <stdio.h>
int
main(void)
{
int x = 16;
int y = 2;
int z = 4;
int32_t coordinates = x | (y << 8) | (z << 16);
fprintf(stdout, "x = %d\n", (coordinates & 0xFF));
fprintf(stdout, "y = %d\n", ((coordinates >> 8) & 0xFF));
fprintf(stdout, "z = %d\n", ((coordinates >> 16) & 0xFF));
return 0;
}
但是你不能编码256,因为它需要多一位,记住你从2 0 开始,所以你只能用8位代表255,所以这里有一个想法
#include <stdint.h>
#include <stdio.h>
#define XSHIFT 0
#define YSHIFT 9
#define ZSHIFT 18
#define GET_X(x) (((x) >> XSHIFT) & 0x1FF)
#define GET_Y(y) (((y) >> YSHIFT) & 0x1FF)
#define GET_Z(z) (((z) >> ZSHIFT) & 0x1FF)
#define ENCODE(x, y, z) (((x) << XSHIFT) | ((y) << YSHIFT) | ((z) << ZSHIFT))
int
main(void)
{
int32_t coordinates = ENCODE(256, 0, 1);
fprintf(stdout, "x = %d\n", GET_X(coordinates));
fprintf(stdout, "y = %d\n", GET_Y(coordinates));
fprintf(stdout, "z = %d\n", GET_Z(coordinates));
return 0;
}
使用32位整数中剩余的8位中的一个额外位。
注意:也许你(和其他人)认为定义XSHIFT
是超级的,但我认为表达式更有意义并且更容易阅读。这是我相信我从物理学习中学到的东西,我很难在代码中看到像x + 7
这样的东西,因为它来自物理定律的数学表达式。