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

时间:2016-04-05 09:21:09

标签: c bit-manipulation bitwise-operators bit bit-shift

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

我可以想到至少两个解决方案......假设我有以下字节: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

是否有更好/更短/更有效的方式?

3 个答案:

答案 0 :(得分:5)

最好的方法是说

b = (b & ~7u) | 3

因为二进制中的3=0...0117u=0..111以及7u的补充是~7u=11...1000,所以操作可以执行您想要的操作。它首先清除最后三位(通过执行b & ~7u),然后设置第一位和第二位(通过对3进行按位或)。

答案 1 :(得分:2)

如果C源代码中包含>>,那么意味着生成的代码将具有移位指令。

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

使用最简单的@Martin James

推荐@blazs解决方案,因为这很容易理解,并且可以很好地应对有符号的整数问题。

(x & ~7u) | 3

答案 2 :(得分:0)

我建议你做第二个解决方案,确定它取决于你的硬件架构,但几乎总是SHIFT操作比ADD快。