我正在尝试使用按位运算来实现我自己的楼层函数。我让它为正数工作,所以我得到
roundDown(5.4) = 5.
我也想舍入负数。例如,我想要
roundDown(-5.4)= -6
我的策略是取负数,清除有符号位使其为正数,加 1,像我对正数所做的那样向下舍入,然后将有符号位设置回 1 以使数字再次为负数。
我的问题是我不知道如何将 1 添加到 unsigned int。我想使用按位运算来做到这一点,我已经做了几个小时,真的很想弄清楚这一点。
我正在尝试使用按位运算来实现我自己的楼层函数。我让它为正数工作,所以我得到
roundDown(5.4) = 5.
我也想舍入负数。例如,我想要
roundDown(-5.4)= -6
我的策略是取负数,清除有符号位使其为正数,加 1,像我对正数所做的那样向下舍入,然后将有符号位设置回 1 以使数字再次为负数。
我的问题是我不知道如何将 1 添加到 unsigned int。我想使用按位运算来做到这一点,我已经做了几个小时,真的很想弄清楚这一点。
由于您使用 roundDown() 处理正数,因此将其用于负数。
double roundDownAll(double x) {
if (x >= 0.0) {
return roundDown(x);
}
else {
double y;
y = -roundDown(-x);
// If no rounding occurred (e.g. -5 == -roundDown(- -5);
if (x == y) {
// We are done.
return y;
}
else {
// rounding occurred in the wrong direction, so compensate.
return y-1;
}
}
}
这篇博客文章展示了如何将一个正数舍float
入到最接近的整数,只对表示进行位操作。对于正数和负数,向下舍入涉及类似的操作(当将正浮点数舍入到最接近的整数时,有时需要向上舍入)。关键步骤是提取指数:
int exp = ((u>>23) & 255) - 127;
1.0
计算应在与输入对齐的浮点数表示中设置什么位:
if (23 - exp < 0) return f;
unsigned int one = 1U << (23 - exp);
并one
用作参考以了解应如何更改重要位:
unsigned int mask = one - 1;
unsigned int frac = u & mask;
...
这是通过位操作实现的增量。Unsigned int 会比 int 更好。
int bitincr(int a)
{
int b = 1;
do
{
int c = a & b;
a = a ^ b;
b = c << 1;
}
while (b != 0);
return a;
}