Класс VectorMask<E>
- Параметры типа:
-
E- упакованная версияETYPE, тип элемента вектораКлассы со значениями и операции с тождеством
VectorMask, наряду сVector, является классом со значениями. СVectorMask, операции, чувствительные к тождеству, такие как==могут давать непредсказуемые результаты или снижать производительность. Странно, ноv.equals(w)вероятно будет быстрее, чемv==w, посколькуequalsне является операцией, чувствительной к тождеству. (Так же как иtoStringиhashCode. ) Кроме того, объекты маски векторов могут храниться в локальных переменных и параметрах, а также в качествеstatic finalконстант, но хранение их в других полях Java или в элементах массива, хотя и семантически допустимо, может привести к снижению производительности.
public abstract class VectorMask<E> extends Object
VectorMask представляет собой упорядоченную неизменяемую последовательность значений boolean. Маска VectorMask и Vector с одинаковым типом элемента (ETYPE) и shape имеют одинаковое количество полос, и поэтому совместимы (точнее, их vector species совместимы).
Некоторые векторные операции принимают (совместимые) маски для управления выбором и операциями над элементами полос входных векторов.
Количество значений в последовательности называется VectorMask length. Длина также соответствует количеству полос маски VectorMask. Элемент полосы с индексом полосы N (от 0, включительно, до длины, исключая её) соответствует N + 1-му значению в последовательности.
Полоса считается установленной, если элемент полосы равен true, в противном случае полоса считается неустановленной, если элемент полосы равен false.
VectorMask объявляет ограниченный набор унарных, бинарных и редукционных операций.
- Унарная операция по полосам работает с одной входной маской и производит маску результата. Для каждой полосы входной маски элемент полосы обрабатывается с помощью указанной скалярной унарной операции, и логическое значение результата помещается в маску результата в той же полосе. Следующий псевдокод иллюстрирует поведение этой категории операций:
VectorMask<E> a = ...; boolean[] ar = new boolean[a.length()]; for (int i = 0; i < a.length(); i++) { ar[i] = scalar_unary_op(a.laneIsSet(i)); } VectorMask<E> r = VectorMask.fromArray(a.vectorSpecies(), ar, 0); - Бинарная операция по полосам работает с двумя входными масками для получения маски результата. Для каждой полосы двух входных масок a и b соответствующие элементы полос из a и b обрабатываются с помощью указанной скалярной бинарной операции, и логическое значение результата помещается в маску результата в той же полосе. Следующий псевдокод иллюстрирует поведение этой категории операций:
VectorMask<E> a = ...; VectorMask<E> b = ...; boolean[] ar = new boolean[a.length()]; for (int i = 0; i < a.length(); i++) { ar[i] = scalar_binary_op(a.laneIsSet(i), b.laneIsSet(i)); } VectorMask<E> r = VectorMask.fromArray(a.vectorSpecies(), ar, 0); - Редукционная операция между полосами принимает входную маску и производит скалярный результат. Для каждой полосы входной маски элемент полосы обрабатывается вместе со скалярным значением накопления с помощью указанной скалярной бинарной операции. Скалярный результат — это конечное значение аккумулятора. Следующий псевдокод иллюстрирует поведение этой категории операций:
Mask<E> a = ...; int acc = zero_for_scalar_binary_op; // 0, or 1 for & for (int i = 0; i < a.length(); i++) { acc = scalar_binary_op(acc, a.laneIsSet(i) ? 1 : 0); // & | + } return acc; // maybe boolean (acc != 0)
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract boolean |
allTrue() |
Возвращает true если все полосы маски установлены. |
abstract VectorMask |
and |
Вычисляет логическое пересечение (в виде a&b) между этой маской и второй входной маской. |
abstract VectorMask |
andNot |
Логически вычитает вторую входную маску из этой маски (в виде a&~b). |
abstract boolean |
anyTrue() |
Возвращает true если какая-либо из полос маски установлена. |
abstract <F> VectorMask |
cast |
Преобразует эту маску в маску заданного вида типа элемента F. |
abstract <F> VectorMask |
check |
Проверяет, применима ли эта маска к векторам с заданным типом элемента, и возвращает эту маску без изменений. |
abstract <F> VectorMask |
check |
Проверяет, имеет ли эта маска заданный вид, и возвращает эту маску без изменений. |
abstract VectorMask |
compress() |
Сжимает установленные полосы из этой маски. |
abstract VectorMask |
eq |
Определяет логическое равенство этой маски и второй входной маски (в виде логического значения a==b или a^~b). |
final boolean |
equals |
Указывает, идентична ли эта маска какому-либо другому объекту. |
abstract int |
firstTrue() |
Возвращает индекс первой полосы маски, которая установлена. |
static <E> VectorMask |
fromArray |
Загружает маску из массива boolean начиная со смещения. |
static <E> VectorMask |
fromLong |
Возвращает маску, где каждая полоса установлена или не установлена в соответствии с битами в заданной битовой маске, начиная с младшего значащего бита и продолжая до знака. |
static <E> VectorMask |
fromValues |
Возвращает маску, где каждая полоса установлена или не установлена в соответствии с заданными boolean значениями. |
protected final Object |
getPayload() |
|
final int |
hashCode() |
Возвращает значение хэш-кода для маски, основанное на установленных битах маски и виде вектора. |
abstract VectorMask |
indexInRange |
Удаляет полосы с номерами N из этой маски, где откорректированный индекс N+offset, не находится в диапазоне [0..limit-1]. |
abstract VectorMask |
indexInRange |
Удаляет полосы с номерами N из этой маски, где откорректированный индекс N+offset, не находится в диапазоне [0..limit-1]. |
abstract void |
intoArray |
Сохраняет эту маску в массив boolean, начиная со смещения. |
abstract boolean |
laneIsSet |
Проверяет, установлена ли полоса с индексом i |
abstract int |
lastTrue() |
Возвращает индекс последней полосы маски, которая установлена. |
final int |
length() |
Возвращает количество полос маски. |
abstract VectorMask |
not() |
Логически инвертирует эту маску. |
abstract VectorMask |
or |
Вычисляет логическое объединение (в виде a|b) этой маски и второй входной маски. |
abstract boolean[] |
toArray() |
Возвращает массив boolean содержащий элементы полос этой маски. |
abstract long |
toLong() |
Возвращает элементы полос этой маски, упакованные в значение long для максимум первых 64 элементов полос. |
final String |
toString() |
Возвращает строковое представление этой маски в формате "Mask[T.TT...]", отображая установки битов маски (как символы 'T' или '.') в порядке полос. |
abstract Vector |
toVector() |
Возвращает векторное представление этой маски, биты полос которой установлены или не установлены в соответствии с битами маски. |
abstract int |
trueCount() |
Возвращает количество полос маски, которые установлены. |
abstract VectorSpecies |
vectorSpecies() |
Возвращает вид вектора, к которому применяется эта маска. |
abstract VectorMask |
xor |
Определяет логическое симметричное различие (в виде a^b) между этой маской и второй входной маской. |
Подробное описание методов
vectorSpecies
public abstract VectorSpecies<E> vectorSpecies()
- Возвращает:
- вид вектора этой маски
length
public final int length()
- Возвращает:
- количество элементов маски
fromValues
public static <E> VectorMask<E> fromValues(VectorSpecies<E> species, boolean... bits)
boolean значениями. Для каждого элемента маски, где N - индекс элемента маски, если заданное boolean значение с индексом N равно true, то элемент маски с индексом N установлен, в противном случае он сброшен.
Заданный вид должен иметь количество элементов, совместимое с заданным массивом.
- Параметры типа:
-
E- тип упакованного элемента - Параметры:
-
species- вид вектора для желаемой маски -
bits- заданныеbooleanзначения - Возвращает:
- маску, где каждый элемент установлен или сброшен в соответствии с заданным
booleanзначением - Исключения:
-
IllegalArgumentException- еслиbits.length != species.length() - См. также:
fromArray
public static <E> VectorMask<E> fromArray(VectorSpecies<E> species, boolean[] bits, int offset)
boolean начиная с смещения. Для каждого элемента маски, где N - индекс элемента маски, если элемент массива с индексом offset + N равен true, то элемент маски с индексом N установлен, в противном случае он сброшен.
- Параметры типа:
-
E- тип упакованного элемента - Параметры:
-
species- вид вектора для желаемой маски -
bits- массивboolean -
offset- смещение в массиве - Возвращает:
- маску, загруженную из массива
boolean - Исключения:
-
IndexOutOfBoundsException- еслиoffset < 0, илиoffset > bits.length - species.length() - См. также:
fromLong
public static <E> VectorMask<E> fromLong(VectorSpecies<E> species, long bits)
Для каждого элемента маски, где N - индекс элемента маски, если выражение (bits>>min(63,N))&1 не равно нулю, то элемент маски с индексом N установлен, в противном случае он сброшен.
Если заданный вид имеет меньше 64 элементов, старшие 64-VLENGTH биты битовой маски игнорируются. Если заданный вид имеет более 64 элементов, бит знака дублируется в элемент 64 и далее.
- Параметры типа:
-
E- тип упакованного элемента - Параметры:
-
species- вид вектора для желаемой маски -
bits- заданные биты маски в виде 64-битового знакового целого числа - Возвращает:
- маска, где каждый элемент установлен или сброшен в соответствии с битами в заданном целочисленном значении
- См. также:
cast
public abstract <F> VectorMask<F> cast(VectorSpecies<F> species)
F. species.length() должен быть равен длине маски. Различные биты элементов маски не изменяются. Для каждого элемента маски, где N - индекс элемента, если элемент маски с индексом N установлен, то элемент маски с индексом N результирующей маски установлен, в противном случае этот элемент маски не установлен.
- Параметры типа:
-
F- тип упакованного элемента вида - Параметры:
-
species- вид вектора для желаемой маски - Возвращает:
- маска, преобразованная по форме и типу элемента
- Исключения:
-
IllegalArgumentException- если длина этой маски и длина вида отличаются
toLong
public abstract long toLong()
long для не более чем первых 64 элементов элементов. Элементы элементов упаковываются в порядке от младшего бита к старшему. Для каждого элемента маски, где N - индекс элемента маски, если элемент маски установлен, то N-й бит установлен в единицу в результирующем значении long, в противном случае N-й бит установлен в ноль. Маска должна иметь не более 64 элементов.
- Возвращает:
- элементы элементов маски, упакованные в значение
long. - Исключения:
-
UnsupportedOperationException- если в этой маске более 64 элементов
toArray
public abstract boolean[] toArray()
boolean содержащий элементы элементов этой маски. Этот метод ведет себя так, как если бы он сохранил эту маску в выделенный массив (используя intoArray(boolean[], int)) и возвращает этот массив следующим образом:
boolean[] a = new boolean[this.length()];
this.intoArray(a, 0);
return a;
- Возвращает:
- массив, содержащий элементы элементов этого вектора
intoArray
public abstract void intoArray(boolean[] a, int offset)
boolean, начиная со смещения. Для каждого элемента маски, где N - индекс элемента маски, элемент элемента с индексом N сохраняется в элемент массива a[offset+N].
- Параметры:
-
a- массив типа boolean[] -
offset- смещение в массиве - Исключения:
-
IndexOutOfBoundsException- еслиoffset < 0илиoffset > a.length - this.length()
anyTrue
public abstract boolean anyTrue()
true если какой-либо из элементов маски установлен.- Возвращает:
-
trueесли какой-либо из элементов маски установлен, в противном случаеfalse.
allTrue
public abstract boolean allTrue()
true если все элементы маски установлены.- Возвращает:
-
trueесли все элементы маски установлены, в противном случаеfalse.
trueCount
public abstract int trueCount()
- Возвращает:
- количество элементов маски, которые установлены.
firstTrue
public abstract int firstTrue()
VLENGTH если ни один из них не установлен.- Возвращает:
- индекс первого установленного элемента маски или
VLENGTH
lastTrue
public abstract int lastTrue()
-1 если ни один из них не установлен.- Возвращает:
- индекс последнего установленного элемента маски или
-1
and
public abstract VectorMask<E> and(VectorMask<E> m)
a&b) между этой маской и второй входной маской. Это бинарная операция на уровне элементов, которая применяет логическую операцию AND (&) к каждой соответствующей паре битов маски.
- Параметры:
-
m- вторая входная маска - Возвращает:
- результат логического соединения двух входных масок
or
public abstract VectorMask<E> or(VectorMask<E> m)
a|b) этой маски и второй входной маски. Это бинарная операция на уровне элементов, которая применяет логическую операцию OR (|) к каждой соответствующей паре битов маски.
- Параметры:
-
m- входная маска - Возвращает:
- результат логического объединения двух входных масок
xor
public abstract VectorMask<E> xor(VectorMask<E> m)
a^b) этой маски и второй входной маски. Это бинарная операция на уровне элементов, которая применяет логическую операцию XOR (^) к каждой соответствующей паре битов маски.
- Параметры:
-
m- входная маска - Возвращает:
- результат логического исключающего или двух входных масок
andNot
public abstract VectorMask<E> andNot(VectorMask<E> m)
a&~b). Это побитовая двоичная операция, которая применяет логическую операцию ANDC (&~) к каждой соответствующей паре битов маски.
- Parameters:
-
m- вторая входная маска - Returns:
- результат логического вычитания второй маски из этой маски
eq
public abstract VectorMask<E> eq(VectorMask<E> m)
a==b или a^~b). Это побитовая двоичная операция, проверяющая каждое соответствие пар битов масок на равенство. Она также эквивалентна логической операции XNOR (^~) к каждой соответствующей паре битов масок.
- Parameters:
-
m- входная маска - Returns:
- маска, показывающая, где две входные маски были равны
- See Also:
not
public abstract VectorMask<E> not()
Это побитовая двоичная операция, которая применяет логическую операцию NOT (~) к каждому биту маски.
- Returns:
- результат логического отрицания этой маски
indexInRange
public abstract VectorMask<E> indexInRange(int offset, int limit)
N из этой маски, где скорректированный индекс N+offset, не находится в диапазоне [0..limit-1]. Во всех случаях серия установленных и не установленных линий назначается так, как если бы использовалась бесконечная точность или VLENGTH- насыщающие сложения или вычитания без переполнения или обхода.
- API Note:
- Этот метод выполняет эмуляцию SIMD проверки, выполненной
Objects.checkIndex(int,int), по номерам индексов в диапазоне[offset..offset+VLENGTH-1]. Если требуется исключение, результирующая маска может быть сравнена с исходной маской; если они не равны, то, по крайней мере, одна линия находилась вне диапазона, и может быть выполнена обработка исключений.Маска, которая представляет собой серию
Nустановленных линий, за которой следует серия не установленных линий, может быть получена путем вызоваallTrue.indexInRange(0, N), гдеallTrue- это маска всех истинных битов. Маска изN1не установленных линий, за которыми следуютN2установленных линий, может быть получена путем вызоваallTrue.indexInRange(-N1, N2). - Parameters:
-
offset- начальный индекс -
limit- верхняя граница (исключительно) диапазона индекса - Returns:
- исходная маска, с не попадающими в диапазон линиями, сброшенными до 0
- See Also:
indexInRange
public abstract VectorMask<E> indexInRange(long offset, long limit)
N из этой маски, где скорректированный индекс N+offset, не находится в диапазоне [0..limit-1]. Во всех случаях серия установленных и не установленных линий назначается так, как если бы использовалась бесконечная точность или VLENGTH- насыщающие сложения или вычитания без переполнения или обхода.
- API Note:
- Этот метод выполняет эмуляцию SIMD проверки, выполненной
Objects.checkIndex(long,long), по номерам индексов в диапазоне[offset..offset+VLENGTH-1]. Если требуется исключение, результирующая маска может быть сравнена с исходной маской; если они не равны, то, по крайней мере, одна линия находилась вне диапазона, и может быть выполнена обработка исключений.Маска, которая представляет собой серию
Nустановленных линий, за которой следует серия не установленных линий, может быть получена путем вызоваallTrue.indexInRange(0, N), гдеallTrue- это маска всех истинных битов. Маска изN1не установленных линий, за которыми следуютN2установленных линий, может быть получена путем вызоваallTrue.indexInRange(-N1, N2). - Parameters:
-
offset- начальный индекс -
limit- верхняя граница (исключительно) диапазона индекса - Returns:
- исходная маска, с не попадающими в диапазон линиями, сброшенными до 0
- Since:
- 19
- See Also:
toVector
public abstract Vector<E> toVector()
N - индекс линии маски, если линия маски установлена в N, то конкретное значение, отличное от значения по умолчанию, -1, помещается в результирующий вектор на индексе линии N. В противном случае значение по умолчанию 0 помещается в результирующий вектор на индексе линии N. Независимо от того, является ли тип элемента (ETYPE) этой маски плавающей точкой или целым числом, значение линии, выбранное маской, будет одним из двух арифметических значений 0 или -1. Для каждого ETYPE самый значимый бит линии вектора установлен, если и только если линия маски установлена. Кроме того, для целочисленных типов все биты линии устанавливаются в линиях, где маска установлена. Возвращаемый вектор такой же, как и вычисленный по ZERO.blend(MINUS_ONE, this), где ZERO и MINUS_ONE - векторы, которые дублируют значение по умолчанию ETYPE и значение ETYPE, представляющее -1, соответственно.
- API Note:
- Для целей статической проверки типов пользователи могут проверить полученный вектор по ожидаемому целочисленному типу линии или спецификации. Если маска предназначена для типа плавающей точки, то результирующий вектор будет иметь ту же форму и размер линии, но целочисленного типа. Если маска предназначена для целочисленной спецификации, результирующий вектор будет точно таким же.
- Returns:
- векторное представление этой маски
- See Also:
laneIsSet
public abstract boolean laneIsSet(int i)
i- Parameters:
-
i- индекс линии - Returns:
- true, если линия с индексом
iустановлена, в противном случае false - Throws:
-
IndexOutOfBoundsException- если индекс находится вне диапазона (< 0 || >= length())
check
public abstract <F> VectorMask<F> check(Class<F> elementType)
elementType == vectorSpecies().elementType()
? this
: throw new ClassCastException().- Type Parameters:
-
F- упакованный тип элемента требуемого типа линии - Parameters:
-
elementType- требуемый тип линии - Returns:
- та же маска
- Throws:
-
ClassCastException- если тип элемента неверен - See Also:
check
public abstract <F> VectorMask<F> check(VectorSpecies<F> species)
species == vectorSpecies()
? this
: throw new ClassCastException().- Type Parameters:
-
F- упакованный тип элемента требуемой спецификации - Parameters:
-
species- векторная спецификация, необходимая для этой маски - Returns:
- та же маска
- Throws:
-
ClassCastException- если спецификация неверна - See Also:
toString
public final String toString()
"Mask[T.TT...]", отображая настройки битов маски (символами 'T' или '.') в порядке линий.- Overrides:
-
toStringв классеObject - Returns:
- строка формата
"Mask[T.TT...]"
equals
public final boolean equals(Object obj)
- Overrides:
-
equalsв классеObject - Parameters:
-
obj- эталонный объект для сравнения. - Returns:
- является ли этот вектор идентичным какому-либо другому объекту
- See Also:
hashCode
public final int hashCode()
- Overrides:
-
hashCodeв классеObject - Returns:
- значение хэш-кода для этой маски
- See Also:
compress
public abstract VectorMask<E> compress()
N — фактическое количество установленных битов в этой маске.- Возвращает:
- сжатую маску этой маски
- С:
- 19
getPayload
protected final Object getPayload()
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/jdk.incubator.vector/jdk/incubator/vector/VectorMask.html