仅使用按位运算符计算 16 的指数
Calculate exponents of 16 using only bitwise operators
如果我使用的循环如下所示:
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 位运算符来实现?
您可以通过观察 16=24 来转换 16 的 i
次方,因此 16i= 24*i,即2i=1<<i
。因此,16i=1<<i*4
,可以改写为1<<(i<<2)
,避免乘法
但是,您不需要直接计算 16 的幂。您可以通过在循环中重复乘以 16 来构造数字,即
convertedHex = (convertedHex << 4) + nextHexDigit;
注意: int c = string.charAt(i)
为您提供字符的 UNICODE 代码点,而不是相应数字的值。请改用此代码:
int nextHexDigit = Character.digit(string.charAt(i), 16);
鉴于 1 << i
与 Math.pow(2, i)
相同,您可以简单地使用 1 << (i * 4)
。但是,请注意,这是假设您正在使用的数据类型不会发生溢出。
在int
的情况下,i的最大值为7,在long
的情况下,最大值为15。
如果我使用的循环如下所示:
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 位运算符来实现?
您可以通过观察 16=24 来转换 16 的 i
次方,因此 16i= 24*i,即2i=1<<i
。因此,16i=1<<i*4
,可以改写为1<<(i<<2)
,避免乘法
但是,您不需要直接计算 16 的幂。您可以通过在循环中重复乘以 16 来构造数字,即
convertedHex = (convertedHex << 4) + nextHexDigit;
注意: int c = string.charAt(i)
为您提供字符的 UNICODE 代码点,而不是相应数字的值。请改用此代码:
int nextHexDigit = Character.digit(string.charAt(i), 16);
鉴于 1 << i
与 Math.pow(2, i)
相同,您可以简单地使用 1 << (i * 4)
。但是,请注意,这是假设您正在使用的数据类型不会发生溢出。
在int
的情况下,i的最大值为7,在long
的情况下,最大值为15。