如何有效地设置一个字节的最后三位?
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...011
和7u=0..111
是二进制的,而7u
的补码是~7u=11...1000
,所以运算就如你所愿。它首先清除最后三位(通过 b & ~7u
),然后设置第一位和第二位(通过与 3
进行按位或)。
我建议您执行第二个解决方案,当然这取决于您的硬件架构,但几乎总是 SHIFT 操作比 ADD 快。
如果 C 源代码中有 >>
,那 而不是 意味着生成的代码将有移位指令。
((x>>3)<<3) | 3
可能 生成与 (x & ~7) | 3
完全相同的代码。编译器的优化非常复杂。
使用最简单的 。
推荐 解决方案,因为它易于理解并且可以很好地解决有符号整数问题。
(x & ~7u) | 3
我想将一个字节的最后三位设置为特定值。达成此目标的最佳方式是什么?
我至少可以想到两个解决方案……假设我有以下字节: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...011
和7u=0..111
是二进制的,而7u
的补码是~7u=11...1000
,所以运算就如你所愿。它首先清除最后三位(通过 b & ~7u
),然后设置第一位和第二位(通过与 3
进行按位或)。
我建议您执行第二个解决方案,当然这取决于您的硬件架构,但几乎总是 SHIFT 操作比 ADD 快。
如果 C 源代码中有 >>
,那 而不是 意味着生成的代码将有移位指令。
((x>>3)<<3) | 3
可能 生成与 (x & ~7) | 3
完全相同的代码。编译器的优化非常复杂。
使用最简单的
推荐
(x & ~7u) | 3