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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想切换给定偏移量的位数。相关的知识,希望对你有一定的参考价值。

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

typedef struct{

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

这是我的类型定义

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

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

bitstream->data[offset]^=1

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

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

答案

你可以简单地使用 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),对象已被正确初始化构造,等等。

以上是关于我想切换给定偏移量的位数。的主要内容,如果未能解决你的问题,请参考以下文章

是否有返回 TimeZone 或基于坐标的偏移量的函数?

在python中获取给定日期和UTC偏移量的GMT时间

拆分给定字节偏移量的 utf-8 编码字符串(python 2.7)

带有索引/偏移量的Ruby gsub?

时区分钟偏移量的 TimeZoneInfo

分享几个实用的代码片段(第二弹)