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.
Use the bitwise AND operator (&) to clear a bit. number &= ~(1 << x); That will clear bit x. You must invert the bit string with the bitwise NOT operator (~), then AND it.
Setting a bitUse the bitwise OR operator ( | ) to set a bit. number |= 1UL << n; That will set the n th bit of number . n should be zero, if you want to set the 1 st bit and so on upto n-1 , if you want to set the n th bit.
For example, this is necessary to change settings in the microcontroller or other devices. We use bitwise operators to change certain bits while not affecting others.
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.
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);
}
This is a perfectly sensible and completely standard idiom.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With