目前我正在使用以下代码来在字节中设置/取消单独的位:
if (bit4Set)
nbyte |= (1 << 4);
else
nbyte &= ~(1 << 4);
但是,你不能用更简单/优雅的方式来实现吗?比如一次操作中设置或取消位(bit)?
注意:我知道我可以编写一个函数来实现这个功能,但我想知道是否有更好的方式。
目前我正在使用以下代码来在字节中设置/取消单独的位:
if (bit4Set)
nbyte |= (1 << 4);
else
nbyte &= ~(1 << 4);
但是,你不能用更简单/优雅的方式来实现吗?比如一次操作中设置或取消位(bit)?
注意:我知道我可以编写一个函数来实现这个功能,但我想知道是否有更好的方式。
|=
和&=
,那么这将更加明显,但您可以编写如下代码:nbyte = (nbyte & ~(1<<4)) | (bit4Set<<4);
请注意,bit4Set
必须为零或一,而不是任何非零值,才能使此操作正常工作。
nbyte = (nbyte & ~(1<<4)) | ((!!bit4Set) << 4)
的作用是处理 bit4Set 不为零或一的情况。 - Alexandre C.将它放在一个函数中,布尔类型将强制所有的bitval输入为0或1。
int change_bit(int val, int num, bool bitval)
{
return (val & ~(1<<num)) | (bitval << num);
}
您是否考虑过给位数分配助记符或标识符,而不是按数字引用它们?
举个例子,假设将第4位设置为启动核反应堆紧急停机。我们可以把它称为 INITIATE_SCRAM
,而不是称之为“第4位”。以下是此代码的示例:
int const INITIATE_SCRAM = 0x10; // 1 << 4
...
if (initiateScram) {
nbyte |= INITIATE_SCRAM;
} else {
nbyte &= ~INITIATE_SCRAM;
}
这段代码在优化后不一定比你原来的代码更有效率,但我认为它更加清晰易懂,可能更易于维护。
nbyte |= (1 << 4);
(1 << 4)
,总是像这样一个常量,那么编译器可能会对其进行优化,使得生成的汇编代码更简单。mov r0, _nbyte
mov r1, 10H ; here is the optimization, no bit shift occured
or r0, r1
st _nbyte, r0
std::bitset
来代替自己进行所有的位操作吗?然后你可以通过数组表示法:bits[3] = bit4Set
来设置相应的位。
flags |= 1 << bit_pos;
要清除一个位,可以使用按位与运算符(&)将该位置为0,例如:flags &= ~(1 << bit_pos);
要切换一个位,可以使用按位异或运算符(^)将该位取反,例如:flags ^= 1 << bit_pos;
- obelix