在位域的平面实现中获取所需位的字节地址?

时间:2013-08-27 04:18:15

标签: c bit-manipulation offset bitarray

鉴于我分配了这样的内存:

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.

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

1 个答案:

答案 0 :(得分: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];