です。式(value - x)
を取る。 value
が2^16に等しく、x
が2 ^( - 15)に等しい場合、(value - x)
の結果は、U16
より大きい98304になります。したがって、この操作を行う前にvalue
をS32
にキャストします。
式((value - x) * y)
の最大値は、整数を保持することができ、32ビットよりも大きい値である、6442450944に等しい98304 * 2^16であろう者がその最大値98304.に発現(value - x)
を縮小してみましょう。したがって、この式をU64
として計算する必要があります。とにかく最初のU32
キャストをS64
キャストに置き換えるだけで済みます。
右ビットシフト演算は、有効ビット数を減らすだけです。したがって、これはより大きなビット数を計算する必要はありません。
min
コールでは、結果が4095より大きくならないようにします。これはU16
に保持できます。もはやキャストは必要ありません。
決勝機能:あなたのコードスニペット、 `min`関数から参照ください機能
uint16_t newValue(uint16_t value, int16_t x, uint16_t y){
int64_t newValue = (int64_t)(value);
newValue -= x;
newValue *= y;
newValue >>= 10;
newValue >>= 4;
newValue = min(newValue, 4095);
// Or as a one liner.
// uint64_t newValue = min(((((int64_t)value - x) * y) >> 10) >> 4, 4095);
return (uint16_t) newValue;
}
? – Sitram
まず、明確で正確なコード(擬似コード)を入力してください。ここではすべての文脈が欠けている。それはCであるはずですか?はいの場合、その質問は何ですか? 「U16」、「ミニ」とは何ですか? –
@JensGustedt私たちはすべてここで開発者です。私たちはすべて、「U16」と「ミニ」の意味を推測することができます。 – sturcotte06