[英]Find the power of a number
我的程序要求用户输入一个2的幂(1、2、4、8..128)。 此外,我必须将a[number]
替换为true或false。 目前,我正在使用switch语句来做到这一点。 但是,我打算编写一个函数来计算功率。 我们如何优化此代码:
switch (requested) {
case 1:
if (b[1] == true)
b[1] = false;
break;
case 2:
if (b[2] == true)
b[2] = false;
break;
case 4:
if (b[3] == true)
b[3] = false;
break;
case 16:
if (b[4] == true)
b[4] = false;
break;
case 32:
if (b[5] == true)
b[5] = false;
break;
case 64:
if (b[6] == true)
b[6] = false;
break;
case 128:
if (b[7] == true)
b[7] = false;
break;
}
您可以使用Integer
提供的功能:
int idx = Integer.numberOfTrailingZeros(requested);
b[idx] = false;
我还将考虑验证用户输入,以确保实际上是2的幂:
int idx = Integer.numberOfTrailingZeros(requested);
if ((1<<idx) != requested) {
throw new InvalidInputException(...);
}
b[idx+1] = false;
不太确定为什么数组索引从1开始,但是无论如何我都会回答。
您可以算出直到0为止所需的位移位数。这将为您提供正确的索引:
int index = 0; // If you want 0-based index, start this at -1.
while(requested > 0) {
index++;
requested >>= 1;
}
b[index] = false;
警告 :如果您出于任何原因需要将该值保留为原始值,则会更改requested
的值,然后创建它的副本: int copy = requested;
并改用它。
注意 :我希望可能内置了一个更合适的功能,但是我不知道它是什么。
如果将数字与布尔值匹配,为什么不使用map? 然后,只要用户点击适当的数字,您就可以简单地检查并更改该值。
//requested by user
long requested = 16;
//I create simply a map of powers set to true initially.
//I presume you have something similar
Map<Long, Boolean> powerBoolMap = new LinkedHashMap<>();
long power = 1;
int numberOfPowersToStore = 20;
for (int i = 0; i < numberOfPowersToStore; i++) {
power = power * 2;
powerBoolMap.put(power, true);
}
//Then here you can just check the requested number against any
//key which is your 'power' and invert it or set to whatever you want.
for (Map.Entry<Long, Boolean> e : powerBoolMap.entrySet()) {
if (e.getKey() == requested) {
powerBoolMap.replace(requested, !e.getValue());
}
}
输出是
{2=true, 4=true, 8=true, 16=false, 32=true, 64=true, 128=true, 256=true, 512=true, 1024=true, 2048=true ...}
目前尚不清楚您要去的是什么。 您是在说“计算幂”,但输入应该已经是幂(两个)。 您还说您“必须将a[number]
替换为真或假”,而没有任何解释您为什么(认为自己)必须这么做。 这个number
应该与2的幂的幂相关,只能从代码中猜测出来。
此外,尽管您的问题中根本没有FP的迹象,但您已用“功能编程”标记了您的问题。
假设这是一次复杂的尝试,将一个数字分解为两个分量的幂,以布尔值表示(相当于数字的二进制表示形式中设置的位),则可以使用BitSet.valueOf(new long[] { requested })
。 该位集在语义上已经等效于boolean
值数组,并且按上述方式构造时,它已经将正确的位设置为true
。
您还可以漂亮地打印它:
int requested = 100;
System.out.println(requested+" = "+
BitSet.valueOf(new long[] { requested }).stream()
.mapToObj(i -> "2^"+i).collect(Collectors.joining(" + ")));
将打印
100 = 2^2 + 2^5 + 2^6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.