Студия Android не может импортировать shr и shl с kotlin [duplicate]

Error действует как фабрика, на самом деле почти все внутренние конструкторы делают: Array, Object, ... все проверяют что-то вроде if (!(this instanceof Array)){ return new Array(arguments);}

Это говорит о том, что в случае ошибки, даже не нужно бросать объект Error ... throw 'Bad things happened'; будет работать, также вы можете даже бросать литерал объекта для отладки:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};
15
задан Cœur 22 July 2017 в 17:28
поделиться

2 ответа

Колин предоставляет побитовые операторные функции infix , доступные только для Int и Long.

Поэтому необходимо преобразовать байты в int для выполнения побитовых операций:

val b : Byte = 127
val res = (b.toInt() and 0x0f).toByte() // evaluates to 15

UPDATE: Поскольку Kotlin 1.1 эти операции доступны непосредственно на байте.

Из bitwiseOperations.kt :

@SinceKotlin("1.1") 
public inline infix fun Byte.and(other: Byte): Byte = (this.toInt() and other.toInt()).toByte()
15
ответ дан Vadzim 16 August 2018 в 10:49
поделиться
  • 1
    Также полезно отметить, что java также увеличивает это преобразование. Это просто неявно. – Raman 14 July 2016 в 15:57

Побитовое «и» любого байтового значения и 0xff всегда будут возвращать исходное значение.

Это просто, если вы нарисуете биты на диаграмме:

00101010   42
11111111   and 0xff
--------
00101010   gives 42
5
ответ дан ams 16 August 2018 в 10:49
поделиться
  • 1
    но почему так много людей используют его для преобразования байта в int? – Allen Vork 29 October 2015 в 13:30
  • 2
    Нет, он используется для обрезания int, чтобы он помещался в байт. – ams 29 October 2015 в 13:37
  • 3
    @AllenVork байты в java являются подписанными , а java неявно преобразует их в int при выполнении побитовых операций (Kotlin просто требует, чтобы это было явным). Поэтому для того, чтобы это расширенное преобразование приводило к ожидаемому положительному значению int, когда начальное значение байта отрицательное, один маскирует 3 байта более высокого порядка расширенного значения int (который включает знаковый бит) через & 0xff. – Raman 14 July 2016 в 14:22
  • 4
    О, x & 0xff - такой классный способ конвертировать в int. Спасибо, я буду использовать его везде. Это заставило меня выглядеть таким умным! – Hai Phan 5 May 2018 в 17:33
Другие вопросы по тегам:

Похожие вопросы: