解释Java代码

时间:2015-06-29 17:52:46

标签: java

有人可以一步一步地向我解释以下代码:

我无法理解,例如:while(0<=--_)$+=(¢.charAt(_)-0x30)<<(_&01l);

此代码工作正常,但我无法理解代码。

public String multiply(String ¢) {
    int $=0,_=¢.length();
    while(0<=--_)$+=(¢.charAt(_)-0x30)<<(_&01l);
    return Integer.toString($);
}

2 个答案:

答案 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