Используя только целочисленную математику, я хотел бы "безопасно" усреднить два беззнаковых ints в С++.
То, что я подразумеваю под "безопасным", - это избежать переполнений (и что-нибудь еще, о чем можно подумать).
Например, усреднение 200 и 5000 легко:
unsigned int a = 200;
unsigned int b = 5000;
unsigned int average = (a + b) / 2; // Equals: 2600 as intended
Но в случае 4294967295 и 5000:
unsigned int a = 4294967295;
unsigned int b = 5000;
unsigned int average = (a + b) / 2; // Equals: 2499 instead of 2147486147
Самое лучшее, что я придумал, это:
unsigned int a = 4294967295;
unsigned int b = 5000;
unsigned int average = (a / 2) + (b / 2); // Equals: 2147486147 as expected
Есть ли лучшие способы?