有人可以一步一步地向我解释以下代码:
我无法理解,例如:while(0<=--_)$+=(¢.charAt(_)-0x30)<<(_&01l);
此代码工作正常,但我无法理解代码。
public String multiply(String ¢) {
int $=0,_=¢.length();
while(0<=--_)$+=(¢.charAt(_)-0x30)<<(_&01l);
return Integer.toString($);
}
答案 0 :(得分:2)
这是故意混淆的代码。让我们从分离变量声明开始:
public String multiply(String ¢) {
int $ = 0;
int _ = ¢.length();
while(0<=--_)$+=(¢.charAt(_)-0x30)<<(_&01l);
return Integer.toString($);
}
现在让我们选择有意义的名字:
public String multiply(String input) {
int result = 0;
int position = input.length();
while(0 <= --position)
result += (input.charAt(position) - 0x30) << (position & 01l);
return Integer.toString(result);
}
现在你只需要了解0x30和01l以及位操作操作&lt;&lt;和&amp;,然后它可能会开始有意义。它仍然是可怕的代码,但更清晰一点。
0x30是0的ascii值。
01l只是表示为long的值1。
&LT;&LT;是左移算子
&安培;是按位AND运算符。
所以while循环中的行说:
添加到结果中,当前位置的字符,转换为数字,位移位,与值1进行AND运算(也就是说,只有其值的数字)。
永远不要写这样的代码,也不要与任何人合作。
答案 1 :(得分:1)
首先让我们用更有意义的东西替换那些变量名......
public String multiply(String input) {
int sum = 0;
int position = input.length();
while (0 <= --position) {
sum += (input.charAt(position) - 0x30) << (position& 01l);
}
return Integer.toString(sum);
}
此函数获取String作为输入并返回int的String值。 while循环为输入字符串中的每个字符运行。因此,如果输入是&#34; 101&#34;它运行3轮。由于$在while循环内增加,我将其重命名为sum。其他名称应该是微不足道的。
现在让我们弄清楚这条神奇的变速线会做什么......
它从字符串和子字段0x30(十进制的48)中获取字符的数字值。这是从0(零)的ascii值,因此删除偏移量并使&#39; 0&#39;等号为0的字符。
如果长度是奇数,右边的部分只是一个leftshift。但是不要忘记while循环中的--length
。结果(如果输入是数字字符串)是单个数字的总和,但每个第二个数字加倍。
据我所知,这个方法确实会成倍增加,但是不会倍增,就像你从数学方面所预期的那样,来自&#34;乘法&#34 ;称为功能。
如果输入是&#34; 123456&#34;此函数计算1 + 2 * 2 + 3 + 4 * 2 + 5 + 6 * 2 = 33。
更多信息: Wikipedia ASCII