// Branchless code examples by Nathan Tippy (@NathanTippy)
public class Branchless
{
public Branchless()
{
int result1a = 0;
int result1b = 0;
int result2a = 0;
int result2b = 0;
for (int i = 0; i < 1_000_000; i++)
{
result1a = xEqualsYReturnAElseB(i, i, 98, 99);
result1b = xEqualsYReturnAElseBVanilla(i, i, 98, 99);
result2a = aLessThanZeroReturnBElseA(i, i);
result2b = aLessThanZeroReturnBElseAVanilla(i, i);
}
System.out.println(result1a);
System.out.println(result1b);
System.out.println(result2a);
System.out.println(result2b);
}
// return x == y ? a : b
public int xEqualsYReturnAElseB(int x, int y, int a, int b)
{
int tmp = ((x - y) - 1) >> 31;
int mask = (((x - y) >> 31) ^ tmp) & tmp;
return (a & mask) | (b & (~mask));
}
// return x == y ? a : b
public int xEqualsYReturnAElseBVanilla(int x, int y, int a, int b)
{
if (x == y)
{
return a;
}
else
{
return b;
}
}
// return a < 0 ? b : a;
public int aLessThanZeroReturnBElseA(int a, int b)
{
int mask = a >> 31;
return (b & mask) | ((~mask) & a);
}
// return a < 0 ? b : a;
public int aLessThanZeroReturnBElseAVanilla(int a, int b)
{
if (a < 0)
{
return b;
}
else
{
return a;
}
}
public static void main(String[] args)
{
new Branchless();
}
}