我尝试编写一个非常紧凑的环形缓冲区。缓冲区包含2^X值(X: 1-7),我需要的是增加X位(LSB),但保留其余变量。我有一个解决方案,但我不知道这是否有效(以前从未修改过指针地址),而且它不是那么紧凑。你知道如何改进这一点吗?
// hardcoded ringbuffersize for better ram usage
// this frees us out, start, end, size variables
// 7 == 128, 6 == 64
#define LIGHTWEIGHT_RING_BUFFER_BITS 7
#define LIGHTWEIGHT_RING_BUFFER_SIZE (1<<LIGHTWEIGHT_RING_BUFFER_BITS)
// thatswhy we cant use 256 buffer size
#define LIGHTWEIGHT_RING_BUFFER_DISABLED LIGHTWEIGHT_RING_BUFFER_SIZE+1
// save new data
*Buffer->In = Data;
// save LSB bits
uint8_t pointermask = Buffer->In;
// discard all LSB bits
Buffer->In >>= LIGHTWEIGHT_RING_BUFFER_BITS;
Buffer->In <<= LIGHTWEIGHT_RING_BUFFER_BITS;
// save the LSB bits + 1
Buffer->In |= ++pointermask & (LIGHTWEIGHT_RING_BUFFER_SIZE - 1)
Buffer->Count++;发布于 2014-08-19 06:04:57
如果您要问的是如何以换行的方式递增指针,答案非常简单。您需要将uint64_t类型转换为您平台上的指针大小。如果所有低位都为零,则第二条语句包装指针。
p ++;
p -= ((uint64_t) p) & (LIGHTWEIGHT_RING_BUFFER_SIZE - 1) ?
0 : LIGHTWEIGHT_RING_BUFFER_SIZE;或者,再次将类型转换替换为适当的类型转换。
p = (uint8_t *) (((uint64_t) p & ~(LIGHTWEIGHT_RING_BUFFER_SIZE - 1)) |
(((uint64_t) p + 1) & (LIGHTWEIGHT_RING_BUFFER_SIZE - 1)));https://stackoverflow.com/questions/25371105
复制相似问题