在C++中设置单个位

4

我有一个5字节的数据元素,需要在C++中设置其中一个字节的某个位,请参考下面的示例代码:

char m_TxBuf[4]; 

我希望将字节m_TxBuf [1]的第二个位设置为高电平。

    
00000 0 00
      ^ 这个
非常感谢您的支持; 谢谢!

1
什么?00**模式是什么意思?它有14个数字,但你说你有5个字节的数据(并且你展示了一个4字节的数组)。而且,你所说的将位2设置为“m_TxBuf[1]字节高位”是什么意思? - jalf
1
我相信他只是在突出显示他想要设置为高电平的位。 - Bill Lynch
抱歉,只是强调要设置的部分,对任何困惑感到抱歉。 - JB_SO
“high of byte” 的意思是什么?为什么你说有5个字节的数据时显示一个4字节数组? - jalf
2
不是“字节高位”,而是“字节m_TxBuf [1]的第2位高”。 “高”是低级数字电子学中用来表示位/线/总线等的“开”状态的词,这在此上下文中意味着“将其设置为1”。 - rmeador
哦,如果人们在英语中使用括号消除歧义,生活会变得简单得多。 :) - jalf
6个回答

14

4

您可以使用按位或 (|) 来设置单个位,使用按位与 (&) 来清除它们。


3
m_TxBuf[1] |= 4;

要设置一个位,您需要使用按位或运算符。上面的代码使用了复合赋值运算符,这意味着左侧是输入之一,输出结果也是其中之一。


3
int bitPos = 2;  // bit position to set
m_TxBuf[1] |= (1 << bitPos);

2

通常我们使用位运算符OR(operator |或operator |=作为一种简写)来设置位。

为了简单起见,假设每个字节有8位(其中MSB被认为是'7st'位,LSB被认为是0th位:MSB 0):

char some_char = 0;
some_char |= 1 << 0; // set the 7th bit (least significant bit)
some_char |= 1 << 1; // set the 6th bit
some_char |= 1 << 2; // set the 5th bit
// etc.

We can write a simple function:

void set_bit(char& ch, unsigned int pos)
{
    ch |= 1 << pos;
}

我们同样可以使用运算符&来测试位。
// If the 5th bit is set...
if (some_char & 1 << 2)
    ...

你还应该考虑使用std::bitset来实现这个目的,它会让你的生活更加轻松。

当你说第8位时,是指值为1还是128(128-000000-1)? - JB_SO
@JB_SO 抱歉,我在帖子中澄清了那个令人困惑的部分。我从 MSB(最高有效位)向 LSB(最低有效位)从左到右进行,因为我们通常在纸上表示位。 MSB 是第一个位,LSB 是第八个位。 - stinky472
设置第8位,因此将值增加1。 - stinky472
我将其切换为 MSB 0 约定(从 0 到 7), 因为回顾起来,“第8位”确实令人困惑。 - stinky472

0

只需使用 std::bitset<40>,然后直接索引位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接