位操作与计数:原理、实现与优化
1. 位操作基础
1.1 逻辑与操作
在某些情况下,由于无法将特定数值嵌入单条指令,编译器需先将数值加载到寄存器,再进行逻辑与操作。例如,对于 0xFFFFFDFF
这个数,无法使用 ANDI
指令,编译器会先将其加载到 $V0
寄存器,再执行 AND
操作。
1.2 位移操作
在 C/C++ 中,位位移操作通过 <<
和 >>
运算符实现。x86 指令集提供了 SHL
(左移)和 SHR
(右移)指令。位移操作常用于 2 的幂次方的乘除运算,也可用于特定位的隔离或组合多个分散位的值。
1.3 浮点数符号位操作
在 IEEE 754 格式的浮点数中,符号位位于最高有效位(MSB)。可以通过以下 C 代码实现不使用 FPU 指令来改变浮点数的符号:
#include <stdio.h>
float my_abs (float i)
{
unsigned int tmp=(*(unsigned int*)&i) & 0x7FFFFFFF;
return *(float*)&tmp;
};
float set_sign (float i)
{
unsigned int tmp=(*(unsign