Предположим, у меня есть два беззнаковых байта b
и x
. Мне нужно вычислить 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);
Мне просто интересно, есть ли какие-нибудь более эффективные способы сделать это, т.е. с помощью некоторых хакерских манипуляций?