Chciałbym uzyskać znak wartości float
jako wartość int
-1 lub 1.Najszybszy sposób na zalogowanie się w Javie?
Unikanie warunkowych jest zawsze dobry pomysł na zmniejszenie kosztów obliczeniowej. Na przykład, jeden sposób mogę myśleć byłoby użyć szybki bit-shift
aby uzyskać znak:
float a = ...;
int sign = a >> 31; //0 for pos, 1 for neg
sign = ~sign; //1 for pos, 0 for neg
sign = sign << 1; //2 for pos, 0 for neg
sign -= 1; //-1 for pos, 1 for neg -- perfect.
lub więcej zwięźle:
int sign = (~(a >> 31) << 1) - 1;
- Czy to wydawać się dobrym podejściem?
- Czy to działa na wszystkich platformach, ze względu na problemy z endianizmem (jak MSB trzyma znak)?
Nie wiedziałem o tym. Prawdopodobnie masz rację co do osiągów. –
+1 It * has * został zoptymalizowany i może obsługiwać takie przypadki, jak NaN itp. – arshajii
Co z Integer.signum(), Long.signum() itp.? Nie musisz wtedy rzutować na typ partnera. –