首页 > 解决方案 > 如何在java中有效地计算这个计算?

问题描述

我想实现以下计算,取一个小于 32 的正整数以获得另一个整数:0 => 0, 1 => 1, 2 => 2, 3 => 4, 4 => 8, 5 => 16, 6 => 32, 7 => 64, 8 => 128, ..., 31 => 1073741824</p>

我可以使用 32 个位置的整数数组。我还可以使用一个表达式,测试为 0,返回 0,左移 n-1 次(抱歉,无法附加代码,编辑器拒绝)。

现在,我正在使用一个静态整数表,我对此很满意。但是,我想知道是否有一种方法可以通过简单的计算来计算结果,该计算的执行速度可能与访问表的速度一样快?

更新。到目前为止,这是我测试过的 4 种解决方案(f1、f2、f3、f4)。在问之前我已经实现了 f1 和 f2 。我在收到答案后测试了 f3 和 f4:

    private static final int[] table =
            new int[] { 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536,
                1<<17, 1<<18, 1<<19, 1<<20, 1<<21, 1<<22, 1<<23, 1<<24, 1<<25, 1<<26, 1<<27, 1<<28, 1<<29, 1<<30 };

    private static final int f1( int v ) { return table[v]; }

    private static final int f2( int v ) { return v == 0 ? 0 : 1<<(v-1); }

    private static final int f3( int v ) { return v == 0 ? 0 : (int)Math.pow( 2, v-1 ); }

    private static final int f4( int v )
    {
        switch ( v )
        {
        case 0: return 0;
        case 1: return 1;
        case 2: return 2;
        case 3: return 4;
        case 4: return 8;
        case 5: return 16;
        case 6: return 32;
        case 7: return 64;
        case 8: return 128;
        case 9: return 256; 
        case 10: return 512;
        case 11: return 1024;
        case 12: return 2048;
        case 13: return 4096;
        case 14: return 8192;
        case 15: return 16384;
        case 16: return 32768;
        case 17: return 65536;
        case 18: return 131072;
        case 19: return 262144;
        case 20: return 524288;
        case 21: return 1048576;
        case 22: return 2097152;
        case 23: return 4194304;
        case 24: return 8388608;
        case 25: return 16777216;
        case 26: return 33554432;
        case 27: return 67108864;
        case 28: return 134217728;
        case 29: return 268435456;
        case 30: return 536870912;
        case 31: return 1073741824;
        default: return -1;
        }
    }

标签: java

解决方案


这个怎么样:

int answer = 0;
if(input == 0)
{
    answer = 0;
}
else
    answer = (int)Math.pow(2, input-1);

如果输入为0,则输出将为 0。

如果您的输入是 4,那么您的输出将是2^(4-1)= 2^3= 8


推荐阅读