了解 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
之外,您的方法更容易理解,而且可能更有效。
获取给定两个数的乘积的模 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
之外,您的方法更容易理解,而且可能更有效。