我想切换给定偏移量的位数。

最后发布: 2020-08-03


问题

我想在给定的 "偏移量 "上切换一个位,我试着用 typedef 创建一个新的类型 "BYTEBUF",它的变量是位流......。

typedef struct{

    char *data;
    unsigned int nb_bytes;
    unsigned long bitlength;
}BYTEBUF;

这是我的类型定义

我想在给定的偏移量上切换位。

我试着用.NET技术,但很多人建议用 "offset8 "代替 "offset"。

bitstream->data[offset]^=1

但很多人建议用 "offset8 "代替 "offset"。

(这是我的第一个问题,所以请原谅任何错误)

c++
回答

你可以简单地使用 std::bitset 类,它为您提供了操作位的所有工具。在您的情况下,您可以这样使用它。

// A array of bits of size 16
std::bitset<16> bits;
// Flip the 6th bit
bits.flip(5);
// Set the 6th bit to one
bits.set(5, true);

如果你需要一个 struct 的可变大小(在你的例子中就是这样),那么你可以做这样的事情。

struct BYTES
{
  char* bytes;

  // Toggle the byte at position
  // Note that I'm not checking for any overflow
  // which you should definitely do
  void toggle(const size_t position)
  {
    bytes[position/8] ^= 1 << (position % 8);
  }
};

// I'm assuming everything has been allocated properly
BYTES b;
// Toggle the 14th bit
b.toggle(14);

The position/8 给出数组中的索引(因为它是一个char的数组),而 position%8 给你一个字符内单位的偏移量。我强烈建议你自己在纸上进行运算,看看这里的图片!


回答

如果你想切换与整数对应的位数 offset,你可以计算。

int bytenum = (offset >> 3);
int bitnum = offset - (bytenum << 3);

那么假设 bitstream 属于 BYTEBUF 你可以做。

bitstream.data[bytenum] ^= (1 << bitnum);

很明显,你需要注意的是: bytenum 在范围内(在由 data),对象已被正确初始化构造,等等。