如何使用 Scala 扩展二进制文件?

How to extend binary with Scala?

我正在尝试完成以下练习:

我在下面尝试过,但我的代码没有按预期运行。

def extend(p: Long): Long = {

  var e =  p.toBinaryString

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

  e.toLong
} 

我在这里做错了什么?我不明白我应该如何更改二进制右十六进制。

@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))
}

第一个问题是 .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