理解Java逐位赞美(〜)用法

时间:2016-05-27 09:42:45

标签: java bitwise-operators

这是获得给定两个数的乘积的模10(%10)的问题。因为数字太大,所以它们被称为字符串。

解决方案将是,

int modulo10(String a, String b) {
    return (a.charAt(a.length()-1)-48)*(b.charAt(b.length()-1)-48)%10;
}

我找到了其他人的解决方案。

int modulo10(String a, String b) {
    return ~-~a.charAt(a.length()-1)*~-~b.charAt(b.length()-1)%10;
}

有人可以帮助我理解它将如何提供所需的正确输出。

1 个答案:

答案 0 :(得分:4)

如果你把它煮沸,你问的是为什么这样做:

int modulo10(char ca, char cb) {
  return (~-~ca * ~-~cb) % 10;
}

假设用每个字符串的最后一个字符调用它。

考虑'0' {/ 1>} ~-~c映射到的内容:

  • '0' == 48
  • ~c => ~48 == -49
  • -~c => -(-49) == 49
  • ~-~c => ~49 == -50

同样适用于'1'

  • '1' == 49
  • ~c => ~49 == -50
  • -~c => -(-50) == 50
  • ~-~c => ~50 == -51

等。因此,字符0-9将映射到整数-50, -51, ... -59等。

那么,你只是把这些映射数中的两个加在一起 ​​- 两者都是负数,所以结果是正的;取模10给出了“正确”的答案。

这看起来像是一个“聪明的**”技巧,对任何阅读它的人来说都是完全不清楚的。

您的方法 - 除了您可以使用'0'而不是文字48之外的事实 - 更容易理解,而且可能更有效。