class SignExtractTest {


  private static final long[] LONG_VALUES = {-1L, 0L, 0x1234567812345678L, 0xFFFFFFFFL, 0x12L, 0x1234L, Long.MIN_VALUE, Long.MAX_VALUE};
  private static final int[] INT_VALUES = {-1, 0, 0x1234, 0x12345678, Integer.MIN_VALUE, Integer.MAX_VALUE};


  private static int signExtractInt1(int x) {
    return (x >> 1) >>> 31;
  }

  private static int signExtractInt2(int x) {
    return (x >> 32) >>> 31;
  }

  private static int signExtractInt3(int x) {
    return (x >> 31) >>> 31;
  }

  private static long signExtractLong1(long x) {
    return (x >> 1) >>> 63;
  }

  private static long signExtractLong2(long x) {
    return (x >> 54) >>> 63;
  }

  private static long signExtractLong3(long x) {
    return (x >> 63) >>> 63;
  }

  private static int WARMUP = 5000;

  public static void main(String[] args) {
    for (int i = 0; i < WARMUP; i++) {
        for (int e : INT_VALUES) {
            assert signExtractInt1(e) == signExtractInt1(e);
            assert signExtractInt2(e) == signExtractInt2(e);
            assert signExtractInt3(e) == signExtractInt3(e);
        }

        for (long e : INT_VALUES) {
            assert signExtractLong1(e) == signExtractLong1(e);
            assert signExtractLong2(e) == signExtractLong2(e);
            assert signExtractLong3(e) == signExtractLong3(e);
        }
    }
  }
}



