现在我正在使用它来设置/取消设置一个字节中的各个位:
if (bit4Set)
nbyte |= (1 << 4);
else
nbyte &= ~(1 << 4);
但是,你不能以更简单/更优雅的方式做到这一点吗?就像在一次操作中设置或取消设置位一样?
注意:我知道我可以写一个函数来做到这一点,我只是想知道我是否不会重新发明轮子。
答案 0 :(得分:13)
当然!如果您在代码中展开|=
和&=
会更明显,但您可以写:
nbyte = (nbyte & ~(1<<4)) | (bit4Set<<4);
请注意,bit4Set
必须为零或一个 - 不是任何非零值 - 才能实现此目的。
答案 1 :(得分:12)
将它放在一个函数中,bool类型将对所有bitval输入强制执行0。
int change_bit(int val, int num, bool bitval)
{
return (val & ~(1<<num)) | (bitval << num);
}
答案 2 :(得分:6)
这是一个非常明智且完全标准的习语。
答案 3 :(得分:5)
您是否考虑过为您的位分配助记符和/或标识符,而不是按编号引用它们?
举个例子,假设设置位4启动核反应堆SCRAM。我们称之为“{4}”,而不是将其称为“第4位”。以下是此代码的外观:
INITIATE_SCRAM
这不一定比原始代码更有效(在优化之后),但我认为它更清晰,并且可能更易于维护。
答案 4 :(得分:2)
这被标记为C ++,所以您是否考虑过使用std::bitset
而不是自己进行所有的位操作?然后你可以使用数组表示法作为:bits[3] = bit4Set
来设置适当的位。
答案 5 :(得分:0)
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