Size: a a a

Scala User Group

2021 February 26

M

Mikhail in Scala User Group
Vasya
Привет. Я новичок в scala. Возник вопрос. У меня есть Int и Boolean. Как их побитово соединить в один BigInt? Например, если Int в битовом представлении - 101 (число 5 в десятичной системе) и Boolean - 1 (true), то BigInt в битовом представлении должен выгдядеть - 1011.
лень писать код, но условно - кастани Int в Long, смести влево на 1 бит, прибавь свой бит от Boolean (0 или 1)
если нужно BigInt, то создай его из Long
источник

M

Mikhail in Scala User Group
Это если твой Boolean будет самым младшим битом
источник

V

Vasya in Scala User Group
val bi: BigInt = (BigInt(0x5) << 1) | BigInt(true)

Как boolean кастануть? Так ошибка
источник

M

Mikhail in Scala User Group
может есть какой-то хитрый метод, но можно просто if (blah) BigInt(1) else BigInt(0)
источник

V

Vasya in Scala User Group
Выглядит коряво, но работает.
val bi: BigInt = (BigInt(0x5) << 1) | BigInt(if (true) 1 else 0)

Нужна магия scala. Как-нибудь обернуть это, чтобы было удобно и читаемо. Что подскажите?
источник

M

Mikhail in Scala User Group
Vasya
Выглядит коряво, но работает.
val bi: BigInt = (BigInt(0x5) << 1) | BigInt(if (true) 1 else 0)

Нужна магия scala. Как-нибудь обернуть это, чтобы было удобно и читаемо. Что подскажите?
тебе читаемо или быстро?
источник

M

Mikhail in Scala User Group
Это уже вполне читаемо (имхо), но не оч быстро. Но это на мой вкус.
источник

V

Vasya in Scala User Group
Mikhail
тебе читаемо или быстро?
Сейчас я более общий вопрос сформулирую. Минутку.
источник

НМ

Никита Мязин... in Scala User Group
Vasya
Выглядит коряво, но работает.
val bi: BigInt = (BigInt(0x5) << 1) | BigInt(if (true) 1 else 0)

Нужна магия scala. Как-нибудь обернуть это, чтобы было удобно и читаемо. Что подскажите?
Зависит от того, насколько вы не любите своих коллег
https://scastie.scala-lang.org/RFqJxo04SgyMcTYgNQraZg
источник

НМ

Никита Мязин... in Scala User Group
так-то оба способа не рекомендуются к применению
источник

V

Vasya in Scala User Group
class Cfg(
   val data: Int, // max 8 bits
   val isCmd: Boolean = false,
   val readByteCount: Int = 0, // max 3 bits
   val delayMs: Int = 0 // max 8 bits
) {
 def toBigInt: BigInt = {
   (BigInt(data) << 12) | (BigInt(if (isCmd) 1 else 0) << 11) | (BigInt(readByteCount) << 8) | BigInt(delayMs)
 }
}

Нужен некий объект, который будет держать внутри себя настройки и при необходимости возвращать их объединёнными в BigInt. Как вообще в scala принято делать объекты, которые просто хранят данные? Агрегат или как назвать.
источник

V

Vasya in Scala User Group
Коллег нет. Это домашний проект. ))
источник

НМ

Никита Мязин... in Scala User Group
ну тогда надо делать оба
источник

V

Vasya in Scala User Group
Никита Мязин
ну тогда надо делать оба
А что с классом? Я пока не разобрался. Вижу есть class, case class, object, trait. Что использовать для моей задачи?
источник

НМ

Никита Мязин... in Scala User Group
Если класс содержит скорее данные, чем логику - case class
Если скорее логику - class
Но мб кто-то поправит
источник

M

Mikhail in Scala User Group
у Boolean нет метода toInt? У меня IDEA закрыто
источник

НМ

Никита Мязин... in Scala User Group
Конкретно этот выглядит больше про данные
источник

V

Vasya in Scala User Group
Никита Мязин
Конкретно этот выглядит больше про данные
Да, чисто данные с методом для конвертации в нужный формат.
источник

НМ

Никита Мязин... in Scala User Group
Mikhail
у Boolean нет метода toInt? У меня IDEA закрыто
нет
источник
2021 February 27

λ

λoλdog in Scala User Group
Vasya
Выглядит коряво, но работает.
val bi: BigInt = (BigInt(0x5) << 1) | BigInt(if (true) 1 else 0)

Нужна магия scala. Как-нибудь обернуть это, чтобы было удобно и читаемо. Что подскажите?
def gg(f: Int, ff: Boolean):BigInt =  BigInt(f << 1 | ff.compare(false) )
источник