鉴于我分配了这样的内存:
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,我就可以执行我需要的操作。
答案 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];