Класс VectorMask<E>
- Параметры типа:
-
E- упакованная версияETYPE, тип элемента вектораКлассы на основе значений и операции с идентичностью
VectorMask, наряду сVector, является классом на основе значений. При использованииVectorMask, операции, чувствительные к идентичности, такие как==могут привести к непредсказуемым результатам или снижению производительности. Необычно, чтоv.equals(w), вероятно, будет быстрее, чемv==w, так какequalsне является методом, чувствительным к идентичности. (Так же, как иtoStringиhashCode.) Кроме того, объекты масок векторов могут храниться в локальных переменных и параметрах, а также в качествеstatic finalконстант, но хранение их в других полях Java или в элементах массива, хотя и семантически допустимо, может привести к снижению производительности.
public abstract class VectorMask<E> extends jdk.internal.vm.vector.VectorSupport.VectorMask<E>
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<E> |
and |
Вычисляет логическое пересечение (как a&b) между этой маской и второй входной маской. |
abstract VectorMask<E> |
andNot |
Логически вычитает вторую входную маску из этой маски (как a&~b). |
abstract boolean |
anyTrue() |
Возвращает true, если какая-либо из линий маски установлена. |
abstract <F> VectorMask<F> |
cast |
Преобразует эту маску в маску заданного вида элемента типа F. |
abstract <F> VectorMask<F> |
check |
Проверяет, относится ли эта маска к векторам с заданным типом элемента, и возвращает эту маску без изменений. |
abstract <F> VectorMask<F> |
check |
Проверяет, имеет ли эта маска заданный вид, и возвращает эту маску без изменений. |
abstract VectorMask<E> |
eq |
Определяет логическое равенство этой маски второй входной маске (как булево a==b или a^~b). |
final boolean |
equals |
Указывает, идентична ли эта маска какому-либо другому объекту. |
abstract int |
firstTrue() |
Возвращает индекс первой линии маски, которая установлена. |
static <E> VectorMask<E> |
fromArray |
Загружает маску из массива boolean, начиная со смещения. |
static <E> VectorMask<E> |
fromLong |
Возвращает маску, где каждая линия установлена или не установлена в соответствии с битами в заданной битовой маске, начиная с наименее значимого бита и продолжая до знака бита. |
static <E> VectorMask<E> |
fromValues |
Возвращает маску, где каждая линия установлена или не установлена в соответствии с заданными значениями boolean. |
final int |
hashCode() |
Возвращает хэш-код маски, основанный на установленных битах маски и виде вектора. |
abstract VectorMask<E> |
indexInRange |
Удаляет линии с номерами N из этой маски, где скорректированный индекс N+offset, не находится в диапазоне [0..limit-1]. |
abstract void |
intoArray |
Записывает эту маску в массив boolean, начиная со смещения. |
abstract boolean |
laneIsSet |
Проверяет, установлена ли линия в индексе i. |
abstract int |
lastTrue() |
Возвращает индекс последней линии маски, которая установлена. |
final int |
length() |
Возвращает количество линий маски. |
abstract VectorMask<E> |
not() |
Логически инвертирует эту маску. |
abstract VectorMask<E> |
or |
Вычисляет логическое объединение (как a|b) этой маски и второй входной маски. |
abstract boolean[] |
toArray() |
Возвращает массив boolean, содержащий элементы линий этой маски. |
abstract long |
toLong() |
Возвращает элементы линий этой маски, упакованные в значение long для не более чем первых 64 элементов линий. |
final String |
toString() |
Возвращает строковое представление этой маски в форме "Mask[T.TT...]", отображая установленные биты маски (как символы 'T' или '.') в порядке линий. |
abstract Vector<E> |
toVector() |
Возвращает векторное представление этой маски, биты линий которой установлены или не установлены в соответствии с битами маски. |
abstract int |
trueCount() |
Возвращает количество линий маски, которые установлены. |
abstract VectorSpecies<E> |
vectorSpecies() |
Возвращает вид вектора, к которому относится эта маска. |
Методы, объявленные в классе jdk.internal.vm.vector.VectorSupport.VectorPayload
getPayload
Подробное описание методов
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- входная маска - Возвращает:
- результат логического дизъюнкции двух входных масок
eq
public abstract VectorMask<E> eq(VectorMask<E> m)
a==b или a^~b). Это бинарная операция по элементам, проверяющая каждое соответствующее пару битов маски на равенство. Она также эквивалентна обратной XOR операции (^~) на битах маски.
- Параметры:
-
m- входная маска - Возвращает:
- маска, показывающая, где две входные маски были равны
- См. также:
andNot
public abstract VectorMask<E> andNot(VectorMask<E> m)
a&~b). Это бинарная операция на уровне регистров, которая применяет логическую операцию ANDC (&~) к каждой соответствующей паре битов маски.
- Parameters:
-
m- вторая входная маска - Returns:
- результат логического вычитания второй маски из этой маски
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:
- исходная маска с сброшенными регистрами, находящимися вне диапазона
- 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
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:
-
toStringin classObject - Returns:
- строка формата
"Mask[T.TT...]"
equals
public final boolean equals(Object obj)
- Overrides:
-
equalsin classObject - Parameters:
-
obj- ссылка на объект, с которым необходимо сравнить. - Returns:
- является ли этот вектор идентичным какому-либо другому объекту
- See Also:
hashCode
public final int hashCode()
- Overrides:
-
hashCodein classObject - Returns:
- значение хеш-кода для этой маски
- See Also:
© 1993, 2021, 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/17/docs/api/jdk.incubator.vector/jdk/incubator/vector/VectorMask.html