我有一个内存块,分配20字节(160位),memset值为1.每个位代表一个输入数据,如果收到数据,则设置位,否则复位。我最初设置了所有160位,如果没有收到数据,我将重置。以下是示例代码:
char *buf = malloc(20);
memset(buf,1,20);
recvfun() {
static int index;
index++;
if(!received)
*buf = *buf ^ (1<<(160-index));
...
}
我认为* buf只提供8位,而不是完整的内存块,所以每当我尝试重置该位时,上面的代码只会在前8位重置。如果假设没有收到第99个数据,我需要重置第99位。能否帮助我实现这一目标。谢谢你宝贵的时间。
答案 0 :(得分:4)
您需要将其分解为字节索引和位索引,例如改变:
if(!received)
*buf = *buf ^ (1<<(160-index));
为:
if (!received)
{
const int byte_index = index / CHAR_BIT;
const int bit_index = index & (1 << CHAR_BIT - 1);
buf[byte_index] ^= (1 << bit_index);
}
另请注意,如果要将所有位初始化为1,则上面代码中的memset(buf,1,20);
应为memset(buf,255,20);
。
答案 1 :(得分:3)
你需要计算两件事:
计算它的代码非常简单:
blockindex = index / 8;
offset = index % 8;
然后通过组合索引和偏移来设置该位:
buf[blockindex] ^= 1 << offset;
编辑:虽然我的回答使用与Paul R相同的原则,但Paul的回答在技术上更好,因为他使用了正确的常量(CHAR_BIT)而不是硬编码8(对我来说很羞耻)。