Подтвердить что ты не робот

Как написать бинарные литералы в Scala?

Scala имеет прямую поддержку для использования шестнадцатеричных и восьмеричных чисел:

scala> 01267 + 0100
res1: Int = 759

scala> 0x12AF + 0x100
res2: Int = 5039

но как вы выражаете целое число как двоичное число в Scala?.

4b9b3361

Ответ 1

Если производительность не является проблемой, вы можете использовать String и преобразовать ее в целое число.

val x = Integer.parseInt("01010101", 2)

Двоичные числа не поддерживаются напрямую, потому что вы можете легко конвертировать из шестнадцатеричного в двоичный и наоборот. Чтобы сделать код более понятным, вы можете поместить двоичный номер в комментарий.

val x = 0x55 //01010101

Ответ 2

В 2.10 вы можете создать строковый интерполятор для этого, например. можно записать b"0010" в значение 2. Используя макросы, вы можете избавиться от связанных с ними затрат времени выполнения и выполнить преобразование во время компиляции. Взгляните на Jason Zaugg macrocosm, чтобы увидеть его в действии:

scala> b"101010"
res4: Int = 42

scala> b"102"
<console>:11: error: exception during macro expansion: invalid binary literal
              b"102"
              ^

Ответ 3

Используя новые механизмы "неявного класса" и "класса значений" в 2.10, вы можете написать что-то вроде этого, чтобы добавить методы удобства без накладных расходов на создание объекта:

implicit class IntToBase( val digits:String ) extends AnyVal {
  def base(b:Int) = Integer.parseInt( digits, b )
  def b = base(2)
  def o = base(8)
  def x = base(16)
}

Это позволяет вам делать что-то вроде

"555".o  // 365 decimal

и никакой объект IntToBase никогда не создается.

Ответ 4

Вам нужно быть осторожным, если вы переводите из целого числа, которое выглядит "как", как предлагает @agilesteel. Например, 0101.b попытается преобразовать 65 десятичных в двоичный (начальный 0 означает восьмеричный), тогда как 101.b будет пытаться преобразовать 101 десятичный в двоичный. Это действительно имеет смысл попытаться преобразовать из String, для которого существует Integer.parseInt, и от числа к двоичному представлению String, для которого существует Integer.toString(x, 2).

Я не могу придумать слишком много прецедентов для программных бинарных литералов. Тем не менее, они сделали это для Java 7 как число с префиксом 0b, поэтому я был бы удивлен, если бы они не отображались в Scala скоро. Java, похоже, отлично справилась с ними в течение 15 лет.

Ответ 5

Если вы планируете использовать его много, вы можете имитировать поведение с неявным преобразованием.

object Extensions {
  implicit def conversion(x: Int) = new BinaryInt(x)
  class BinaryInt(x: Int) {
    def b = {
      // Conversion code like Integer.parseInt
      // as Kim suggested
    }
  }
}

Теперь вы можете делать такие вещи, как

import Extensions._
val x = 0101.b
// or
val x = 5.b

Вы должны сами решить, в каком направлении должно идти конверсия.

Ответ 6

Если вы хотите получить строку двоичного представления Int, вы можете вызвать 4.toBinaryString. Отступы сложнее. Вам нужно будет сделать что-то вроде: 4.toBinaryString.reverse.padTo(8, "0").reverse.mkString