1

鉴于我这样分配内存:

Create(int width, int height, int depth)
{    
    size_t numBits = width * height * depth;
    size_t numBytes = numBits / 8 + numBits % 8 != 0 ? 1 : 0;
    bytes = malloc(numBytes);
    ...

现在我想获取给定 x、y、b 的字节偏移量:

DoSomething(int x, int y, int bit)
{
    Byte* byte = bytes + ... some offset ...

例如,如果我说Create(3, 3, 3)然后DoSomething(0, 1, 1)我会将字节偏移量计算为 0。如果我说DoSomething(0, 2, 2)那将是第 9 位,那么我会将偏移量计算为 1。

一旦我有了字节,我就可以执行我需要的操作。

4

1 回答 1

1

首先,我认为您弄错了运算符优先级。如果您将字节数计算为

numBits / 8 + numBits % 8 != 0 ? 1 : 0

那么它将被解析为

(numBits / 8 + numBits % 8 != 0) ? 1 : 0

即,您将始终最终分配 0 或 1 个字节。我想你的意思是

numBits / 8 + (numBits % 8 != 0 ? 1 : 0);

反而。或者只是做通常的总结技巧:

numBytes = (numBits + 7) / 8;

现在是的,我们可以手动进行数学运算,但是您为什么不简单地使用指向数组的指针并将复杂的数学运算留给编译器呢?

unsigned char (*mat)[height][depth] = malloc((width + 7) / 8 * sizeof(*mat));

那么获取地址就很简单了:

unsigned char *ptr = &mat[x / 8][y][z];
于 2013-08-27T04:30:03.633 回答