8203352: Improve java implementation of Integer/Long.numberOfLeadingZeros
Co-authored-by: Ivan Gerasimov <ivan.gerasimov@oracle.com> Reviewed-by: martin, igerasim
This commit is contained in:
parent
bff7296db3
commit
55ba3cad8b
@ -1618,16 +1618,15 @@ public final class Integer extends Number implements Comparable<Integer> {
|
|||||||
*/
|
*/
|
||||||
@HotSpotIntrinsicCandidate
|
@HotSpotIntrinsicCandidate
|
||||||
public static int numberOfLeadingZeros(int i) {
|
public static int numberOfLeadingZeros(int i) {
|
||||||
// HD, Figure 5-6
|
// HD, Count leading 0's
|
||||||
if (i <= 0)
|
if (i <= 0)
|
||||||
return i == 0 ? 32 : 0;
|
return i == 0 ? 32 : 0;
|
||||||
int n = 1;
|
int n = 31;
|
||||||
if (i >>> 16 == 0) { n += 16; i <<= 16; }
|
if (i >= 1 << 16) { n -= 16; i >>>= 16; }
|
||||||
if (i >>> 24 == 0) { n += 8; i <<= 8; }
|
if (i >= 1 << 8) { n -= 8; i >>>= 8; }
|
||||||
if (i >>> 28 == 0) { n += 4; i <<= 4; }
|
if (i >= 1 << 4) { n -= 4; i >>>= 4; }
|
||||||
if (i >>> 30 == 0) { n += 2; i <<= 2; }
|
if (i >= 1 << 2) { n -= 2; i >>>= 2; }
|
||||||
n -= i >>> 31;
|
return n - (i >>> 1);
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1761,18 +1761,9 @@ public final class Long extends Number implements Comparable<Long> {
|
|||||||
*/
|
*/
|
||||||
@HotSpotIntrinsicCandidate
|
@HotSpotIntrinsicCandidate
|
||||||
public static int numberOfLeadingZeros(long i) {
|
public static int numberOfLeadingZeros(long i) {
|
||||||
// HD, Figure 5-6
|
|
||||||
if (i <= 0)
|
|
||||||
return i == 0 ? 64 : 0;
|
|
||||||
int n = 1;
|
|
||||||
int x = (int)(i >>> 32);
|
int x = (int)(i >>> 32);
|
||||||
if (x == 0) { n += 32; x = (int)i; }
|
return x == 0 ? 32 + Integer.numberOfLeadingZeros((int)i)
|
||||||
if (x >>> 16 == 0) { n += 16; x <<= 16; }
|
: Integer.numberOfLeadingZeros(x);
|
||||||
if (x >>> 24 == 0) { n += 8; x <<= 8; }
|
|
||||||
if (x >>> 28 == 0) { n += 4; x <<= 4; }
|
|
||||||
if (x >>> 30 == 0) { n += 2; x <<= 2; }
|
|
||||||
n -= x >>> 31;
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -83,6 +83,8 @@ public class BitTwiddle {
|
|||||||
throw new RuntimeException("i");
|
throw new RuntimeException("i");
|
||||||
if (numberOfLeadingZeros(1) != (SIZE - 1))
|
if (numberOfLeadingZeros(1) != (SIZE - 1))
|
||||||
throw new RuntimeException("j");
|
throw new RuntimeException("j");
|
||||||
|
if (numberOfLeadingZeros(Integer.MAX_VALUE) != 1)
|
||||||
|
throw new RuntimeException("lzmax");
|
||||||
|
|
||||||
if (numberOfTrailingZeros(0) != SIZE)
|
if (numberOfTrailingZeros(0) != SIZE)
|
||||||
throw new RuntimeException("k");
|
throw new RuntimeException("k");
|
||||||
@ -96,6 +98,13 @@ public class BitTwiddle {
|
|||||||
if (numberOfLeadingZeros(x) != numberOfTrailingZeros(reverse(x)))
|
if (numberOfLeadingZeros(x) != numberOfTrailingZeros(reverse(x)))
|
||||||
throw new RuntimeException("n: " + toHexString(x));
|
throw new RuntimeException("n: " + toHexString(x));
|
||||||
}
|
}
|
||||||
|
for (int i = 1, r = SIZE - 1; i != 0; i <<= 1, r--) {
|
||||||
|
if (numberOfLeadingZeros(i) != r ||
|
||||||
|
numberOfTrailingZeros(i) != (SIZE - r - 1) ||
|
||||||
|
numberOfLeadingZeros(i) != numberOfTrailingZeros(reverse(i))) {
|
||||||
|
throw new RuntimeException("lzx: " + toHexString(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (bitCount(0) != 0)
|
if (bitCount(0) != 0)
|
||||||
throw new RuntimeException("o");
|
throw new RuntimeException("o");
|
||||||
@ -152,11 +161,8 @@ public class BitTwiddle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final String ZEROS = "0".repeat(32);
|
||||||
private static String leftpad(String s, int width) {
|
private static String leftpad(String s, int width) {
|
||||||
String r = s;
|
return ZEROS.substring(0, width - s.length()) + s;
|
||||||
for (int c = 0; c < width - s.length(); c++) {
|
|
||||||
r = "0" + r;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -83,6 +83,10 @@ public class BitTwiddle {
|
|||||||
throw new RuntimeException("i");
|
throw new RuntimeException("i");
|
||||||
if (numberOfLeadingZeros(1) != (SIZE - 1))
|
if (numberOfLeadingZeros(1) != (SIZE - 1))
|
||||||
throw new RuntimeException("j");
|
throw new RuntimeException("j");
|
||||||
|
if (numberOfLeadingZeros(Long.MAX_VALUE) != 1)
|
||||||
|
throw new RuntimeException("lzmax");
|
||||||
|
if (numberOfLeadingZeros(Integer.MAX_VALUE + 1L) != (SIZE - 32))
|
||||||
|
throw new RuntimeException("lz32");
|
||||||
|
|
||||||
if (numberOfTrailingZeros(0) != SIZE)
|
if (numberOfTrailingZeros(0) != SIZE)
|
||||||
throw new RuntimeException("k");
|
throw new RuntimeException("k");
|
||||||
@ -96,6 +100,13 @@ public class BitTwiddle {
|
|||||||
if (numberOfLeadingZeros(x) != numberOfTrailingZeros(reverse(x)))
|
if (numberOfLeadingZeros(x) != numberOfTrailingZeros(reverse(x)))
|
||||||
throw new RuntimeException("n: " + toHexString(x));
|
throw new RuntimeException("n: " + toHexString(x));
|
||||||
}
|
}
|
||||||
|
for (long i = 1, r = SIZE - 1; i != 0; i <<= 1, r--) {
|
||||||
|
if (numberOfLeadingZeros(i) != (int)r ||
|
||||||
|
numberOfTrailingZeros(i) != (SIZE - (int)r - 1) ||
|
||||||
|
numberOfLeadingZeros(i) != numberOfTrailingZeros(reverse(i))) {
|
||||||
|
throw new RuntimeException("lzx: " + toHexString(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (bitCount(0) != 0)
|
if (bitCount(0) != 0)
|
||||||
throw new RuntimeException("o");
|
throw new RuntimeException("o");
|
||||||
@ -152,11 +163,8 @@ public class BitTwiddle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final String ZEROS = "0".repeat(64);
|
||||||
private static String leftpad(String s, int width) {
|
private static String leftpad(String s, int width) {
|
||||||
String r = s;
|
return ZEROS.substring(0, width - s.length()) + s;
|
||||||
for (int c = 0; c < width - s.length(); c++) {
|
|
||||||
r = "0" + r;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user