В Java символ & является побитовым оператором AND.
x & y
Если два операнда (в данном случае x и y)) имеет разные типы.Значение малого типа неявно повышается до большего типа.
байт, короткий, символ => int => long
long & long => long
int & int => int
int & long => long & long => long
(byte|char|short) & int => int & int => int
(byte|char|short) & long => int & long => long & long => long
В вашем случае
deviceFd.revents (short) & OsConstants.POLLOUT (int)
будет повышен
deviceFd.revents (int) & OsConstants.POLLOUT (int)
Результат int
type.
В Kotlin сделать то же самое, что и в Java.
Шаг 1. Потому что Kotlin НЕ продвигает меньший тип к большему типу неявно, поэтому вы (как программист) должны сделать это явно.
deviceFd.revents (short) => deviceFd.revents.toInt() (int)
Шаг 2. В Котлине нет символа & , поэтому вынеобходимо использовать и для выполнения побитовой операции И между двумя значениями.
deviceFd.revents.toInt() and OsConstants.POLLOUT
Сложить вместе.
if ((deviceFd.revents.toInt() and OsConstants.POLLOUT) != 0) {
Log.d(TAG, "Write to device")
writeToDevice(outputStream)
}
Обновление: На основании комментария автора
deviceFd.events |= (short) OsConstants.POLLOUT;
Java
deviceFd.events (short) | OsConstants.POLLOUT (int)
deviceFd.events (int) | OsConstants.POLLOUT (int)
deviceFd.events = (short)(deviceFd.events (int) | OsConstants.POLLOUT (int))
Эквивалент Kotlin
deviceFd.events = (deviceFd.events.toInt() or OsConstants.POLLOUT).toShort()
Kotlin
deviceFd.events = deviceFd.events or OsConstants.POLLOUT.toShort()
Побитовые операциинаходится в экспериментальном состоянии, есть ли лучшее решение?
Это единственный и официальный способиспользовать побитовые операции в Kotlin.Кроме того, при компиляции в байт-код Java они все еще используют побитовые операции Java (| &
) под капотом.
Кстати, побитовые операции находятся в экспериментальном состоянии, но когда эта функция будет завершена, они будутперейти в рабочее состояние, не нарушая текущий код.