Został zaprojektowany do pracy z 32-bitowymi wartościami podpisanymi. Zróbmy to krok po kroku.
((b)-(a))>>31)
Prawy operator przesunięcia w zasadzie przyjmuje najwyższy bit w wartości 32-bitowej, a znak-rozszerza go do pozostałych 31 bitów. Tak działa operator prawej zmiany dla wartości podpisanych.
Jeśli b
jest większa niż a
, wynik odejmowania będzie dodatni, najwyższy bit będzie 0, a rezultatem tego jest 0.
Jeśli b
jest mniejsza niż a
, wynik z odejmowanie będzie ujemne, najwyższy bit będzie wynosił 1, a wynikiem będzie -1. Najwyższy bit zostanie przesunięty w dół do wszystkich pozostałych bitów. Wszystkie bity w 32-bitowej wartości zostaną ustawione, co oznacza -1.
Możesz to sprawdzić samodzielnie, pisząc krótki program, który umieszcza wartość dodatnią lub ujemną w 32-bitowym int
, przesuwa w prawo o 31-bitów; następnie obserwując, że wynik będzie wynosił 0 lub -1. Jak wiadomo, w arytmetyce uzupełnień dwubajtowych wartość -1
zawiera wszystkie ustawione bity.
((a)-(b)) & (0 or -1, as the result of the previous operation).
Tak więc, jeśli b
jest mniejsza niż a
, prawa ręka ma wartość bok wszystkie bity ustawione, a wynik z operatorem bitowym &
jest wartość po lewej stronie. lub a-b
.
Jeśli b
jest większa niż a
, wartość po prawej stronie ma wszystkie bity 0, a wynikiem &
jest 0.
Podsumowując:
If b
jest mniejsza niż a
, powyższe wyrażenie do:
a-(a-b)
or
a-a+b
or
b
A jeśli b
jest większa niż a
, wynikiem wyrażenia jest
a - 0
or
a
Nie mogę zagwarantować poprawności, ale mogę sobie wyobrazić, że głównym celem tej funkcji jest unikanie rozgałęzień. – Banex
@Banex Funkcja została napisana dla gpu, myślę, że to miałoby sens, dobry punkt! –
Opiera się również na zawijanym arytmetycznym przepełnieniu w aritmetyce wokół –