256 の数値を除算し、より近い値に丸める必要があります。たとえば、255 を入力した場合、0 ではなく 1 を取得します。
int x = 150;
int z = MulDiv(x, 1, 256);
しかし、それは私の目標を達成するための最適な方法ではないと思います.誰かがより良い方法をアドバイスできますか.
256 の数値を除算し、より近い値に丸める必要があります。たとえば、255 を入力した場合、0 ではなく 1 を取得します。
int x = 150;
int z = MulDiv(x, 1, 256);
しかし、それは私の目標を達成するための最適な方法ではないと思います.誰かがより良い方法をアドバイスできますか.
これを使って:
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;
これは、正と負の両方の整数 (およびゼロも) で機能します。
int eps = x < 0 ? -128 : 128
int y = (x + eps) / 256;
義務-pedantic
とf[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;
最も近い符号付きの値に正しく丸めるには、次のようにします。
y = (x >= 0 ? (x + 128) : (x - 128)) / 256;