将三个坐标(x,y,z)编码为一个整数或浮点数

时间:2016-07-20 13:28:49

标签: c encoding struct types mpi

我在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

有什么想法吗?

1 个答案:

答案 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这样的东西,因为它来自物理定律的数学表达式。