繁体   English   中英

求数的幂

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM