1. ホーム
  2. c++

[解決済み] 符号なしバイトの飽和減算・加算について

2023-06-04 10:58:40

質問

2つの符号なしバイトがあるとします。 bx . を計算する必要があります。 bsub として b - x そして badd として b + x . しかし、これらの操作でアンダーフローやオーバーフローが発生するのは困ります。例えば(擬似コード)。

b = 3; x = 5;
bsub = b - x; // bsub must be 0, not 254

b = 250; x = 10;
badd = b + x; // badd must be 255, not 4

明らかな方法として、分岐があります。

bsub = b - min(b, x);
badd = b + min(255 - b, x);

私はただ、これを行うためのより良い方法、すなわち、いくつかのハッキリとしたビット操作による方法はないのでしょうか?

どのように解決するのですか?

記事 分岐のない飽和演算 はこのための戦略を提供しています。

その足し算の解法は以下の通りです。

u32b sat_addu32b(u32b x, u32b y)
{
    u32b res = x + y;
    res |= -(res < x);

    return res;
}

uint8_t用に修正しました。

uint8_t  sat_addu8b(uint8_t x, uint8_t y)
{
    uint8_t res = x + y;
    res |= -(res < x);

    return res;
}

となり、その引き算の解は

u32b sat_subu32b(u32b x, u32b y)
{
    u32b res = x - y;
    res &= -(res <= x);

    return res;
}

uint8_t用に修正しました。

uint8_t sat_subu8b(uint8_t x, uint8_t y)
{
    uint8_t res = x - y;
    res &= -(res <= x);

    return res;
}