我想将一个字节的最后三位设置为特定的值。归档这一目标的最佳方式是什么?
我可以想到至少两个解决方案......假设我有以下字节: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
是否有更好/更短/更有效的方式?
答案 0 :(得分:5)
最好的方法是说
b = (b & ~7u) | 3
因为二进制中的3=0...011
和7u=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快。