了解Java按位恭维(~)用法

了解Java按位恭维(~)用法,java,bitwise-operators,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

要得到给定两个数的乘积的模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;
}
假设使用每个字符串的最后一个字符调用它

考虑
~-c
映射到的
'0'

  • '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
被映射到int
-50,-51-59

那么,你只需要将两个映射的数字相乘-都是负数,所以结果是正数;取模10给出了“正确”的答案

这看起来像是一个“聪明的a**”把戏,任何人都不清楚


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

感谢您的清晰解释。这个解决方案必须尽可能小。(减少使用的字符数)。这就是为什么使用“48”而不是zero的字符表示。但也感谢您指出这一点。:)为什么要否决这个?他们能否给出一个理由,以便我们修改错误并改正错误。我没有否决,但“你能帮我理解吗”是一个模糊的问题。它没有解释你不理解的事情,也没有解释你做了什么(这是相关的,因为没有必要花时间在回答中解释这些事情)。