4

我正在尝试使用按位运算来实现我自己的楼层函数。我让它为正数工作,所以我得到

 roundDown(5.4) = 5. 

我也想舍入负数。例如,我想要

roundDown(-5.4)= -6

我的策略是取负数,清除有符号位使其为正数,加 1,像我对正数所做的那样向下舍入,然后将有符号位设置回 1 以使数字再次为负数。

我的问题是我不知道如何将 1 添加到 unsigned int。我想使用按位运算来做到这一点,我已经做了几个小时,真的很想弄清楚这一点。

4

3 回答 3

3

由于您使用 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;
    }
  }
}
于 2013-05-23T19:46:23.540 回答
0

这篇博客文章展示了如何将一个正数舍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;
...
于 2013-05-23T22:43:14.350 回答
0

这是通过位操作实现的增量。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;
}
于 2013-05-23T22:26:30.850 回答