4

ビット演算を使用して独自のフロア関数を実装しようとしています。私はそれが正の数のために働いているので、私は得る

 roundDown(5.4) = 5. 

負の数も切り捨てたい。たとえば、私はしたいです

roundDown(-5.4)= -6

私の戦略は、負の数を取り、符号付きビットをクリアして正にし、1 を加え、正の数の場合と同様に切り捨ててから、符号付きビットを 1 に戻して数値を再び負にすることです。

私の問題は、unsigned int に 1 を追加する方法がわからないことです。私はこれを行うためにビット演算を使用したいと思っています。私は何時間もそれに取り組んできましたが、本当にこれを理解したいと思っています。

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 に答える