Scala имеет прямую поддержку для использования шестнадцатеричных и восьмеричных чисел:
scala> 01267 + 0100
res1: Int = 759
scala> 0x12AF + 0x100
res2: Int = 5039
но как вы выражаете целое число как двоичное число в Scala?.
Scala имеет прямую поддержку для использования шестнадцатеричных и восьмеричных чисел:
scala> 01267 + 0100
res1: Int = 759
scala> 0x12AF + 0x100
res2: Int = 5039
но как вы выражаете целое число как двоичное число в Scala?.
Если производительность не является проблемой, вы можете использовать String и преобразовать ее в целое число.
val x = Integer.parseInt("01010101", 2)
Двоичные числа не поддерживаются напрямую, потому что вы можете легко конвертировать из шестнадцатеричного в двоичный и наоборот. Чтобы сделать код более понятным, вы можете поместить двоичный номер в комментарий.
val x = 0x55 //01010101
В 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"
^
Используя новые механизмы "неявного класса" и "класса значений" в 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 никогда не создается.
Вам нужно быть осторожным, если вы переводите из целого числа, которое выглядит "как", как предлагает @agilesteel. Например, 0101.b
попытается преобразовать 65 десятичных в двоичный (начальный 0 означает восьмеричный), тогда как 101.b
будет пытаться преобразовать 101 десятичный в двоичный. Это действительно имеет смысл попытаться преобразовать из String, для которого существует Integer.parseInt
, и от числа к двоичному представлению String, для которого существует Integer.toString(x, 2)
.
Я не могу придумать слишком много прецедентов для программных бинарных литералов. Тем не менее, они сделали это для Java 7 как число с префиксом 0b
, поэтому я был бы удивлен, если бы они не отображались в Scala скоро. Java, похоже, отлично справилась с ними в течение 15 лет.
Если вы планируете использовать его много, вы можете имитировать поведение с неявным преобразованием.
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
Вы должны сами решить, в каком направлении должно идти конверсия.
Если вы хотите получить строку двоичного представления Int, вы можете вызвать 4.toBinaryString
. Отступы сложнее. Вам нужно будет сделать что-то вроде: 4.toBinaryString.reverse.padTo(8, "0").reverse.mkString