设置/取消设置单个位的简单方法

时间:2010-08-06 12:39:06

标签: c++ bit-manipulation

现在我正在使用它来设置/取消设置一个字节中的各个位:

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

但是,你不能以更简单/更优雅的方式做到这一点吗?就像在一次操作中设置或取消设置位一样?

注意:我知道我可以写一个函数来做到这一点,我只是想知道我是否不会重新发明轮子。

6 个答案:

答案 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