views:

240

answers:

6

Hi, I have a 5 byte data element and I need some help in figuring out how in C++ to set an individual bit of one of these byte; Please see my sample code below:

char m_TxBuf[4]; 

I would like to set bit 2 to high of byte m_TxBuf[1].

    
00000 0 00
      ^ This one

Any support is greatly appreciated; Thanks!

+12  A: 

Bitwise operators in C++.

"...set bit 2..."

Bit endianness.

I would like to set bit 2 to high of byte m_TxBuf[1];

m_TxBuf[1] |= 1 << 2

andras
Thanks for all comments :)
JB_SO
+3  A: 

You can use bitwise-or (|) to set individual bits, and bitwise-and (&) to clear them.

Anon.
+1  A: 
m_TxBuf[1] |= 4;

To set a bit, you use bitwise or. The above uses compound assignment, which means the left side is one of the inputs and the output.

Matthew Flaschen
+2  A: 
int bitPos = 2;  // bit position to set
m_TxBuf[1] |= (1 << bitPos);
Amardeep
+1  A: 

Typically we set bits using bitwise operator OR (operator| or operator|= as a shorthand).

Assuming 8-bits to a byte (where the MSB is considered the '7st' bit and the LSB considered the 0th: MSB 0) for simplicity:

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;
}

We can likewise test bits using operator&.

// If the 5th bit is set...
if (some_char & 1 << 2)
    ...

You should also consider std::bitset for this purpose which will make your life easier.

When you mean the 8th bit, do you mean for the value of 1 or 128 (128-000000-1)
JB_SO
@JB_SO Apologies, I clarified that confusing part in the post. I'm going left to right from MSB (most significant bit) to LSB as we typically represent bits on paper. The MSB is the 1st bit, LSB 8th.
Setting the 8th bit, therefore, increases the value by 1.
Unless, of course, it's already set :)
Bart van Heukelom
I switched it to MSB 0 convention (ranging from 0 to 7) since '8th' bit really is confusing in retrospect.
A: 

Just use std::bitset<40> and then index bits directly.

Noah Roberts