Simple way to set/unset an individual bit

2020-05-26 08:57发布

Right now I'm using this to set/unset individual bits in a byte:

if (bit4Set)
   nbyte |= (1 << 4);
else
   nbyte &= ~(1 << 4);

But, can't you do that in a more simple/elegant way? Like setting or unsetting the bit in a single operation?

Note: I understand I can just write a function to do that, I'm just wondering if I won't be reinventing the wheel.

6条回答
狗以群分
2楼-- · 2020-05-26 09:13

Put it in a function, the bool type will enforce 0,1 for all bitval inputs.

int change_bit(int val, int num, bool bitval)
{
    return (val & ~(1<<num)) | (bitval << num);
}
查看更多
我欲成王,谁敢阻挡
3楼-- · 2020-05-26 09:14

Have you considered assigning mnemonics and/or identifiers to your bits, rather than referring to them by number?

As an example, let's say setting bit 4 initiates a nuclear reactor SCRAM. Instead of referring to it as "bit 4" we'll call it INITIATE_SCRAM. Here's how the code for this might look:

int const INITIATE_SCRAM = 0x10; // 1 << 4

...

if (initiateScram) {
    nbyte |= INITIATE_SCRAM;
} else {
    nbyte &= ~INITIATE_SCRAM;
}

This won't necessarily be any more efficient (after optimization) than your original code, but it's a little clearer, I think, and probably more maintainable.

查看更多
欢心
4楼-- · 2020-05-26 09:18

This is a perfectly sensible and completely standard idiom.

查看更多
够拽才男人
5楼-- · 2020-05-26 09:18

This is tagged as C++ so have you considered using std::bitset instead of doing all the bit manipulation yourself? Then you can just use array notation as: bits[3] = bit4Set to set the appropriate bit.

查看更多
时光不老,我们不散
6楼-- · 2020-05-26 09:19
nbyte |= (1 << 4);

If the right hand side of the assignment, (1 << 4), is always a constant like this, then this would probably be optimized by compiler so it will be simpler in resulting assembly:

mov r0, _nbyte
mov r1, 10H         ; here is the optimization, no bit shift occured
or r0, r1
st _nbyte, r0
查看更多
Ridiculous、
7楼-- · 2020-05-26 09:33

Sure! It would be more obvious if you expanded the |= and &= in your code, but you can write:

nbyte = (nbyte & ~(1<<4)) | (bit4Set<<4);

Note that bit4Set must be zero or one —not any nonzero value— for this to work.

查看更多
登录 后发表回答