在一块内存中复位

时间:2012-10-01 11:17:57

标签: c logic bit-manipulation

我有一个内存块,分配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位。能否帮助我实现这一目标。谢谢你宝贵的时间。

2 个答案:

答案 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(对我来说很羞耻)。