了解Java按位恭维(~)用法
要得到给定两个数的乘积的模10(%10),这是一个问题。因为数字太大,所以它们被作为字符串给出 解决办法是,了解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
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的字符表示。但也感谢您指出这一点。:)为什么要否决这个?他们能否给出一个理由,以便我们修改错误并改正错误。我没有否决,但“你能帮我理解吗”是一个模糊的问题。它没有解释你不理解的事情,也没有解释你做了什么(这是相关的,因为没有必要花时间在回答中解释这些事情)。