6

256 の数値を除算し、より近い値に丸める必要があります。たとえば、255 を入力した場合、0 ではなく 1 を取得します。

int x = 150;
int z = MulDiv(x, 1, 256);

しかし、それは私の目標を達成するための最適な方法ではないと思います.誰かがより良い方法をアドバイスできますか.

4

4 に答える 4

7

これを使って:

unsigned int x = 150;
unsigned int z = (x + 128) >> 8;

128 は中間値なので、これを追加すると丸めが機能する256=2^8ため、除算の代わりにビット シフト演算を使用できます。

注:この方法は、正の値に対してのみ機能します。

正の値と負の値にこれが必要な場合は、次のものが必要になります。

int x = -150;
int z = (x >= 0 ? (x + 128) : (x - 128)) / 256;

注:符号付き値のビット シフトには特定の機能があり、常に信頼できるとは限らないため、これを使用することはできません。int z = (x < 0) ? (x - 128) / 256 : (x + 128) >> 8;

于 2013-09-14T14:28:41.477 に答える
4

これは、正と負の両方の整数 (およびゼロも) で機能します。

int eps = x < 0 ? -128 : 128
int y = (x + eps) / 256;

義務-pedanticf[oo|ai]lsafeバージョン:

if (x < INT_MIN + 128 || x > INT_MAX - 128) {
    fputs("nasal demons!\n", stderr);
    abort();
}

int eps = x < 0 ? -128 : 128;
int y = (x + eps) / 256;
于 2013-09-14T14:34:28.640 に答える
1

最も近い符号付きの値に正しく丸めるには、次のようにします。

y = (x >= 0 ? (x + 128) : (x - 128)) / 256;
于 2013-09-14T14:36:11.847 に答える