2013-07-30 22 views
8

Hızlı bilgi işlem maksimum değerleri için AGGREGATE Magic'dan bir hile buldum. Bunun tamsayılar için tek sorun olduğunu ve ancak bazı şeyleri denedim, imzasız tamsayılar için nasıl bir sürüm oluşturulacağını bilmiyorum.İmzasız tamsayılar için hızlı dalsız max

inline int32_t max(int32_t a, int32_t b) 
{ 
    return a - ((a-b) & (a-b)>>31); 
} 

Herhangi bir öneri? diğerleri bunun tanımsız davranış üretir belirtildiği gibi çünkü

DÜZENLEME

, bu kullanmayın. Herhangi bir modern mimari için, derleyici, return (a > b) ? a : b'dan bir branşsız koşullu hareket talimatı yayınlayabilecektir, bu da söz konusu işlevin daha hızlı olacaktır.

+24

Bekle '> bir dönüş b? a: b'? –

+10

Bu işlev oldukça kullanışsızdır. 'Std :: max' kullanın. –

+2

Evet, boru hattı ile modern CPU'larda, dalları yavaştır. Daha hızlı değilse, bu sürümü SSE sürümü kadar hızlı ölçtüm. – plasmacel

cevap

9

Bu kod ne yapıyor? Bir ve a - b farkını alır. Tabii ki a - (a - b), b'dur. Ve (a - b) >> 31 sadece a - b'un negatif olduğu bir maske oluşturur.

Bu kod yanlıştır, çıkartmada bir taşma olursa. Bununla birlikte, imzasız tamsayılarla aynı hikaye. Dolayısıyla bunu kod tüm değer aralığı için doğru olmadığını, aslında hoşnutsanız IFF, sadece unsignedness görmezden ve bu kullanabilirsiniz: bu daha hızlıdır gerçekten emin olan,

inline uint32_t umax(uint32_t a, uint32_t b) { 
    return (uint32_t)max((int32_t)a, (int32_t)b); 
}