22 Kasım 2018 Perşembe

UnsignedLong Sınıfı

compare metodu
İmzası şöyle
public static int compare(long a, long b);
Bu metodun daha açık hali şöyle.
public static boolean isLessThanUnsigned(long n1, long n2) {

  boolean comp = (n1 < n2);

  if ((n1 < 0) != (n2 < 0)) {

    comp = !comp;

  }
  return comp;
}
Açıklaması şöyle.
The idea is that if the sign bits are the same, then we can perform an "ordinary" signed comparison— in effect the result will be the same as just comparing the bottom 63 bits. If the sign bits are different, then the number that has the sign bit set (is really "negative" as a signed number) should be treated as bigger, and vice versa. In other words, if the sign bits are different, we reverse the comparison.
Bu metodu XOR ile daha da kısaltmak mümkün. X ^ Y yaparken eğer y 0 ise sonuç X çıkar. Eğer Y 1 ise sonuç X'in tersi çıkar.
Tablo şöyle
0 ^ 0 = 0
1 ^ 0 = 1

0 ^ 1 = 1
1 ^ 1 = 0

Kod şöyle yapılabilir.
public static boolean isLessThanUnsigned(long n1, long n2) {
  return (n1 < n2) ^ ((n1 < 0) != (n2 < 0));
}