我想切换给定偏移量的位数。
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
),对象已被正确初始化构造,等等。
以上是关于我想切换给定偏移量的位数。的主要内容,如果未能解决你的问题,请参考以下文章