Package org.apache.lucene.util

# Class BitUtil

java.lang.Object
org.apache.lucene.util.BitUtil

public final class BitUtil extends Object
A variety of high efficiency bit twiddling routines and encoders for primitives.

NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.

## Field Summary

Fields
Modifier and Type
Field
Description
`static final ByteOrder`
`NATIVE_BYTE_ORDER`
Native byte order.
`static final VarHandle`
`VH_BE_DOUBLE`
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
`static final VarHandle`
`VH_BE_FLOAT`
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
`static final VarHandle`
`VH_BE_INT`
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
`static final VarHandle`
`VH_BE_LONG`
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
`static final VarHandle`
`VH_BE_SHORT`
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
`static final VarHandle`
`VH_LE_DOUBLE`
A `VarHandle` to read/write little endian `double` from a byte array.
`static final VarHandle`
`VH_LE_FLOAT`
A `VarHandle` to read/write little endian `float` from a byte array.
`static final VarHandle`
`VH_LE_INT`
A `VarHandle` to read/write little endian `int` from a byte array.
`static final VarHandle`
`VH_LE_LONG`
A `VarHandle` to read/write little endian `long` from a byte array.
`static final VarHandle`
`VH_LE_SHORT`
A `VarHandle` to read/write little endian `short` from/to a byte array.
`static final VarHandle`
`VH_NATIVE_DOUBLE`
A `VarHandle` to read/write native endian `double` from a byte array.
`static final VarHandle`
`VH_NATIVE_FLOAT`
A `VarHandle` to read/write native endian `float` from a byte array.
`static final VarHandle`
`VH_NATIVE_INT`
A `VarHandle` to read/write native endian `int` from a byte array.
`static final VarHandle`
`VH_NATIVE_LONG`
A `VarHandle` to read/write native endian `long` from a byte array.
`static final VarHandle`
`VH_NATIVE_SHORT`
A `VarHandle` to read/write native endian `short` from/to a byte array.

## Method Summary

Modifier and Type
Method
Description
`static long`
`deinterleave(long b)`
Extract just the even-bits value as a long from the bit-interleaved value
`static long`
`flipFlop(long b)`
flip flops odd with even bits
`static long`
`interleave(int even, int odd)`
Interleaves the first 32 bits of each long value
`static boolean`
`isZeroOrPowerOfTwo(int x)`
Return true if, and only if, the provided integer - treated as an unsigned integer - is either 0 or a power of two.
`static int`
`nextHighestPowerOfTwo(int v)`
returns the next highest power of two, or the current value if it's already a power of two or zero
`static long`
`nextHighestPowerOfTwo(long v)`
returns the next highest power of two, or the current value if it's already a power of two or zero
`static int`
`zigZagDecode(int i)`
Decode an int previously encoded with `zigZagEncode(int)`.
`static long`
`zigZagDecode(long l)`
Decode a long previously encoded with `zigZagEncode(long)`.
`static int`
`zigZagEncode(int i)`
Same as `zigZagEncode(long)` but on integers.
`static long`
`zigZagEncode(long l)`
Zig-zag encode the provided long.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### NATIVE_BYTE_ORDER

public static final ByteOrder NATIVE_BYTE_ORDER
Native byte order.

Warning: This constant is `ByteOrder.nativeOrder()` only in production environments, during testing we randomize it. If you need to communicate with native APIs (e.g., Java's Panama API), use `ByteOrder.nativeOrder()`.

### VH_LE_SHORT

public static final VarHandle VH_LE_SHORT
A `VarHandle` to read/write little endian `short` from/to a byte array. Shape: `short vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, short val)`

### VH_LE_INT

public static final VarHandle VH_LE_INT
A `VarHandle` to read/write little endian `int` from a byte array. Shape: `int vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, int val)`

### VH_LE_LONG

public static final VarHandle VH_LE_LONG
A `VarHandle` to read/write little endian `long` from a byte array. Shape: `long vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, long val)`

### VH_LE_FLOAT

public static final VarHandle VH_LE_FLOAT
A `VarHandle` to read/write little endian `float` from a byte array. Shape: `float vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, float val)`

### VH_LE_DOUBLE

public static final VarHandle VH_LE_DOUBLE
A `VarHandle` to read/write little endian `double` from a byte array. Shape: `double vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, double val)`

### VH_NATIVE_SHORT

public static final VarHandle VH_NATIVE_SHORT
A `VarHandle` to read/write native endian `short` from/to a byte array. Shape: `short vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, short val)`

Warning: This handle uses default order only in production environments, during testing we randomize it. If you need to communicate with native APIs (e.g., Java's Panama API), use `ByteOrder.nativeOrder()`.

### VH_NATIVE_INT

public static final VarHandle VH_NATIVE_INT
A `VarHandle` to read/write native endian `int` from a byte array. Shape: `int vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, int val)`

Warning: This handle uses default order only in production environments, during testing we randomize it. If you need to communicate with native APIs (e.g., Java's Panama API), use `ByteOrder.nativeOrder()`.

### VH_NATIVE_LONG

public static final VarHandle VH_NATIVE_LONG
A `VarHandle` to read/write native endian `long` from a byte array. Shape: `long vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, long val)`

Warning: This handle uses default order only in production environments, during testing we randomize it. If you need to communicate with native APIs (e.g., Java's Panama API), use `ByteOrder.nativeOrder()`.

### VH_NATIVE_FLOAT

public static final VarHandle VH_NATIVE_FLOAT
A `VarHandle` to read/write native endian `float` from a byte array. Shape: `float vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, float val)`

Warning: This handle uses default order only in production environments, during testing we randomize it. If you need to communicate with native APIs (e.g., Java's Panama API), use `ByteOrder.nativeOrder()`.

### VH_NATIVE_DOUBLE

public static final VarHandle VH_NATIVE_DOUBLE
A `VarHandle` to read/write native endian `double` from a byte array. Shape: `double vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, double val)`

Warning: This handle uses default order only in production environments, during testing we randomize it. If you need to communicate with native APIs (e.g., Java's Panama API), use `ByteOrder.nativeOrder()`.

### VH_BE_SHORT

@Deprecated public static final VarHandle VH_BE_SHORT
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
A `VarHandle` to read/write big endian `short` from a byte array. Shape: `short vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, short val)`

### VH_BE_INT

@Deprecated public static final VarHandle VH_BE_INT
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
A `VarHandle` to read/write big endian `int` from a byte array. Shape: `int vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, int val)`

### VH_BE_LONG

@Deprecated public static final VarHandle VH_BE_LONG
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
A `VarHandle` to read/write big endian `long` from a byte array. Shape: `long vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, long val)`

### VH_BE_FLOAT

@Deprecated public static final VarHandle VH_BE_FLOAT
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
A `VarHandle` to read/write big endian `float` from a byte array. Shape: `float vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, float val)`

### VH_BE_DOUBLE

@Deprecated public static final VarHandle VH_BE_DOUBLE
Deprecated.
Better use little endian unless it is needed for backwards compatibility.
A `VarHandle` to read/write big endian `double` from a byte array. Shape: `double vh.get(byte[] arr, int ofs)` and `void vh.set(byte[] arr, int ofs, double val)`

## Method Details

### nextHighestPowerOfTwo

public static int nextHighestPowerOfTwo(int v)
returns the next highest power of two, or the current value if it's already a power of two or zero

### nextHighestPowerOfTwo

public static long nextHighestPowerOfTwo(long v)
returns the next highest power of two, or the current value if it's already a power of two or zero

### interleave

public static long interleave(int even, int odd)
Interleaves the first 32 bits of each long value

Adapted from: http://graphics.stanford.edu/~seander/bithacks.html#InterleaveBMN

### deinterleave

public static long deinterleave(long b)
Extract just the even-bits value as a long from the bit-interleaved value

### flipFlop

public static long flipFlop(long b)
flip flops odd with even bits

### zigZagEncode

public static int zigZagEncode(int i)
Same as `zigZagEncode(long)` but on integers.

### zigZagEncode

public static long zigZagEncode(long l)
Zig-zag encode the provided long. Assuming the input is a signed long whose absolute value can be stored on `n` bits, the returned value will be an unsigned long that can be stored on `n+1` bits.

### zigZagDecode

public static int zigZagDecode(int i)
Decode an int previously encoded with `zigZagEncode(int)`.

### zigZagDecode

public static long zigZagDecode(long l)
Decode a long previously encoded with `zigZagEncode(long)`.

### isZeroOrPowerOfTwo

public static boolean isZeroOrPowerOfTwo(int x)
Return true if, and only if, the provided integer - treated as an unsigned integer - is either 0 or a power of two.