Как расширить бинарный файл с помощью Scala? - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь выполнить следующее упражнение:

My exercise

Я попытался выполнить это ниже, но мой код не работает, как ожидалось.

def extend(p: Long): Long = {

  var e =  p.toBinaryString

  if ( e.count(_== '1') % 2 == 0) {
    e="0"+e
  }else {
    e="1"+e
  }

  e.toLong
} 

Что я здесь не так делаю?Я не понимаю, как я должен изменить двоичный код правильно Hex.

@Test def testExtend() {
  assertEquals("extend(0x0000000000000000L)", 0x0000000000000000L, extend(0x0000000000000000L))
  assertEquals("extend(0x0000000000000001L)", 0x8000000000000001L, extend(0x0000000000000001L))
  assertEquals("extend(0x0000000000000011L)", 0x0000000000000011L, extend(0x0000000000000011L))
  assertEquals("extend(0x8000000000000000L)", 0x0000000000000000L, extend(0x8000000000000000L))
  assertEquals("extend(0x8000000000F00000L)", 0x0000000000F00000L, extend(0x8000000000F00000L))
  assertEquals("extend(0x0000001000300000L)", 0x8000001000300000L, extend(0x0000001000300000L))
}

1 Ответ

0 голосов
/ 04 марта 2019

Первая проблема заключается в том, что .toLong предполагает, что преобразуется String представление десятичного значения.Поэтому предполагается, что "10" представляет десять (десятичное число), а не два (двоичное).

Следующая проблема заключается в том, что Long имеет фиксированную длину.Вы не можете добавить дополнительный бит к нему.Вы должны перевернуть существующий бит.

def extend(p: Long): Long =
  if (p.toBinaryString.count(_ == '1') % 2 == 0) p
  else p ^ Long.MinValue

тестирование:

0x0000000000000000L == extend(0x0000000000000000L)  //res0: Boolean = true
0x8000000000000001L == extend(0x0000000000000001L)  //res1: Boolean = true
0x0000000000000011L == extend(0x0000000000000011L)  //res2: Boolean = true
0x0000000000000000L == extend(0x8000000000000000L)  //res3: Boolean = true
0x0000000000F00000L == extend(0x8000000000F00000L)  //res4: Boolean = true
0x8000001000300000L == extend(0x0000001000300000L)  //res5: Boolean = true
...