Разветвления и поиск в памяти - это то, чего следует избегать при выполнении микрооптимизации на фрагменте кода.Со встроенной сборкой вы можете просто использовать CMOV (Условное MOV), чтобы ускорить работу на системах x86.Компилятор горячей точки Java также может быть использован для использования этой инструкции.Но так как фрагмент очень прост, выполнение слишком большого количества операций, чтобы избежать разветвлений или поиска в памяти, может (в конце концов) быть пораженческим.
static int[] QUAD_LUT = new int[]{1, 2, 4, 3};
...
// use the sign bit on the integers
return QUAD_LUT[ (x >>> 31) | ((y >>> 30) & 0x2) ]
Когда вы думаете о результате, то после
x.sign y.sign Quad
0 0 1
0 1 4
1 0 2
1 1 3
Вы можете получить по формуле
(x.sign XOR y.sign + y.sign + y.sign) + 1
Так в Java
y = (y>>>31);
return ((x>>>31) ^ y) + y + y + 1;
РЕДАКТИРОВАТЬ Только для людей, интересующихся встроенной сборкой ...
;; NASM/FASM syntax
;; GetQuadrant(int x, int y)
;; RETURN [1|2|3|4] in EAX register
GetQuadrant:
MOV eax, [esp+4] ;; = x
MOV ecx, [esp+8] ;; = y
SHR eax, 31 ;; = >> 31
SHR ecx, 31 ;; = >> 31
XOR eax, ecx ;; = x XOR y
LEA eax, [eax + ecx * 2 + 1] ;; = x + y*2 + 1
RET 8 ;; correct stack and return