如何有效地设置一个字节的最后三位?

How to set last three bit of a byte efficiently?

我想将一个字节的最后三位设置为特定值。达成此目标的最佳方式是什么?

我至少可以想到两个解决方案……假设我有以下字节:1101 0110 并且想将最后三位设置为 011。

解决方案 1:

 1101 0110
&1111 1000 //and with mask to clear last three bits
|0000 0011 //add the target bits

解决方案 2:

 1101 0110 >> 3 //shift right to remove last three
 0001 1010 << 3 //shift left to clear last three
|0000 0011 //add target bits

有没有better/shorter/more有效的方法?

最好的办法就是说

b = (b & ~7u) | 3

因为3=0...0117u=0..111是二进制的,而7u的补码是~7u=11...1000,所以运算就如你所愿。它首先清除最后三位(通过 b & ~7u),然后设置第一位和第二位(通过与 3 进行按位或)。

我建议您执行第二个解决方案,当然这取决于您的硬件架构,但几乎总是 SHIFT 操作比 ADD 快。

如果 C 源代码中有 >>,那 而不是 意味着生成的代码将有移位指令。

((x>>3)<<3) | 3 可能 生成与 (x & ~7) | 3 完全相同的代码。编译器的优化非常复杂。

使用最简单的

推荐 解决方案,因为它易于理解并且可以很好地解决有符号整数问题。

(x & ~7u) | 3