【问题标题】:Calculate exponents of 16 using only bitwise operators仅使用按位运算符计算 16 的指数
【发布时间】:2015-11-27 09:11:18
【问题描述】:

如果我使用如下所示的循环:

String string = "DF3";
for (int i = string.length() - 1; i >= 0; --i) {
        int c = string.charAt(i);

        convertedHex += (i << 4);

}

如何在不使用Math.pow()、另一个循环或乘法的情况下计算Math.pow(16, i)?具体来说,如何使用 only 位运算符来做到这一点?

【问题讨论】:

    标签: java hex bit-manipulation


    【解决方案1】:

    您可以通过观察 16=24 来转换 i-16 的幂,因此 16i=24*i,以及 2i=1&lt;&lt;i。因此,16i=1&lt;&lt;i*4,可以改写为1&lt;&lt;(i&lt;&lt;2),避免相乘。

    但是,您不需要直接计算 16 的幂。您可以在循环中通过重复乘以 16 来构造数字,即

    convertedHex = (convertedHex << 4) + nextHexDigit;
    

    注意: int c = string.charAt(i) 为您提供字符的 UNICODE 代码点,而不是相应数字的值。请改用此代码:

    int nextHexDigit = Character.digit(string.charAt(i), 16);
    

    【讨论】:

    • 我不能使用乘法。
    【解决方案2】:

    鉴于1 &lt;&lt; iMath.pow(2, i) 相同,您可以简单地使用1 &lt;&lt; (i * 4)。但是请注意,这是假设您使用的数据类型不会发生溢出。

    int 的情况下,i 的最大值为 7,long 的情况下,最大值为 15。

    【讨论】:

    • 我应该进一步说明——我不能使用任何乘法。
    • 在这种情况下,(i * 4) 可以替换为(i &lt;&lt; 2)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2020-12-07
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多