了解 Java 位补码 (~) 用法

Understanding Java bit-wise compliment (~) usage

获取给定两个数的乘积的模 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;
}

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

如果你把它归结起来,你要问的是为什么它有效:

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

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

考虑 '0'~-~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 给出 "correct" 答案。

这看起来像一个 "smart a**" 把戏,任何阅读它的人都完全不清楚。

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