Java-реализация Long.numberOfTrailingZeros () - PullRequest
2 голосов
/ 28 июня 2011

Ссылка на документацию: http://download.oracle.com/javase/6/docs/api/java/lang/Long.html#numberOfTrailingZeros%28long%29

Вот исходный код реализации Java:

/**
 * Returns the number of zero bits following the lowest-order ("rightmost")
 * one-bit in the two's complement binary representation of the specified
 * <tt>long</tt> value.  Returns 64 if the specified value has no
 * one-bits in its two's complement representation, in other words if it is
 * equal to zero.
 *
 * @return the number of zero bits following the lowest-order ("rightmost")
 *     one-bit in the two's complement binary representation of the
 *     specified <tt>long</tt> value, or 64 if the value is equal
 *     to zero.
 * @since 1.5
 */
public static int numberOfTrailingZeros(long i) {
    // HD, Figure 5-14
int x, y;
if (i == 0) return 64;
int n = 63;
y = (int)i; if (y != 0) { n = n -32; x = y; } else x = (int)(i>>>32);
y = x <<16; if (y != 0) { n = n -16; x = y; }
y = x << 8; if (y != 0) { n = n - 8; x = y; }
y = x << 4; if (y != 0) { n = n - 4; x = y; }
y = x << 2; if (y != 0) { n = n - 2; x = y; }
return n - ((x << 1) >>> 31);
}

Этот алгоритм разбивает long на две целые и имеет дело с каждым int. Мой вопрос: почему бы не использовать y = x << 32 вместо того, чтобы разбивать длинное на части? </p>

Вот моя версия:

public static int bit(long i)
{
    if (i == 0) return 64;
    long x = i;
    long y;
    int n = 63;
    y = x << 32; if (y != 0) { n -= 32; x = y; }
    y = x << 16; if (y != 0) { n -= 16; x = y; }
    y = x <<  8; if (y != 0) { n -=  8; x = y; }
    y = x <<  4; if (y != 0) { n -=  4; x = y; }
    y = x <<  2; if (y != 0) { n -=  2; x = y; }
    return (int) (n - ((x << 1) >>> 63));
}

Я проверил оба метода и усреднил. Время реализации: 595, время моей версии: 593. Возможно, оригинальная реализация быстрее на 32-битных системах, потому что я использую 64-битную Windows 7. По крайней мере, Java должна использовать что-то вроде моей версии в своем x64 SDK. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Разница в производительности в 0,5 процента может быть проигнорирована практически в каждом приложении.Если вы работаете с одним приложением, которое требует максимальной производительности для этого метода, вы можете реализовать его самостоятельно.

1 голос
/ 31 октября 2015

В последних версиях Java, скажем Java 8, такие функции являются встроенными.

http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/classfile/vmSymbols.hpp#l681

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...