Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 制作基本算法_Java - Fatal编程技术网

Java 制作基本算法

Java 制作基本算法,java,Java,因此,基本上我想找到一种更简单的方法: if(size == 2 || size == 6 || size == 10 || size == 14 || ...) unit /= 2; 所以基本上它从2开始,然后检查是否等于之前的大小+4 我需要增加到256 我想知道是否有一个简单的方法可以做到这一点 编辑:很抱歉,我的意思是在一行中完成所有操作,而不是在多行中完成。如果它一直升高4,您可以尝试使用模块4: if ((size - 2) % 4 == 0 && size &l

因此,基本上我想找到一种更简单的方法:

 if(size == 2 || size == 6 || size == 10 || size == 14 || ...) unit /= 2;
所以基本上它从2开始,然后检查是否等于之前的大小+4

我需要增加到256

我想知道是否有一个简单的方法可以做到这一点


编辑:很抱歉,我的意思是在一行中完成所有操作,而不是在多行中完成。

如果它一直升高4,您可以尝试使用模块4:

if ((size - 2) % 4 == 0 && size <= 256){
    unit /= 2;
}

你可以在O1中用

if ((size - 2) % 4 == 0){
    /*2, 6, 10 etc*/    
    unit >>= (Math.min(size, 256) + 2) / 4;
}
其中,按位移位生成二次幂的适当乘法:这是您了解运算符先例的试金石


现在问题已经更新,单元上的操作是相当单调的单元/=2,您必须添加新引入的256大小上限。

您可以使用如下switch语句来完成:

switch(size) {
    case 2:
        unit /=2;
    case 4:
        unit /= 2;
    ....
}
但这仍然很麻烦。另一种选择是:

for(int i=2; i < 256; i+=4) {
    if (size == i) {    
        unit /= 4;
    }
}

我会使用一个可能的除数数组

如果要除以的数字发生变化,则将其扩展到类中

如果存在某种数学级数,如d[n+1]=d[n]+4,则可快速推导除数

您可以这样做:

if ( size >= 2 && size <= 256 && size % 4 == 2 ) 
    unit /= 2;

一种神秘的方式:

unit >>= ((size & -253) == 2) ? 1 : 0;
说明:

2-254范围内的数字也在0-255范围内。您可以使用~255=0xffffff00进行位AND运算;如果该值不为零,则该值超出该范围; 若要检查并计算数字%4,请对3进行位AND运算;将其与2进行比较,以查看数字%4是否=2。 因此,为了检查一个数字是否满足这两个条件,我们可以使用上面两个位掩码的按位AND计算大小的按位AND:如果两个条件都满足,结果是2

因此:

(size & (~255 | 3)) == 2   (simplifies to)   (size & -253) == 2.


为了确认,它对于大小==3是不变的,例如?@Bathsheba是的,它是不变的,只是为了确保我至少对这个例子理解正确:如果大小是2,那么你想将单位3除以2^3->除以8,如果大小是6,那么将单位2除以4,再除以10,再除以一次2?它总是除以2。唯一需要更改的是,它检查大小是否等于先前的+4。因此,如果size==14,下一行将加上。它总是被2分开。我投票决定把这个问题作为离题题来结束,因为不断变化的问题是不可能回答的。分开还是左移?此外,如果大小为2,单位除以2的次数要多得多…@AndyTurner:我们将联合发布。我认为您需要更像258大小/4大小的东西,对于大小2,您应该减半64倍;对于254号,您应该只使用一次。它可以充分恢复2、6和10个案例;也许OP可以证实?真遗憾:-这个答案太漂亮了。大小一直在增加,直到256。它不会在10点停止。@ShawnSmith-固定数量4?每次?如果是这样,您需要uniknow的第二部分。很抱歉,我看错了问题,问题已更新。@OldCurmudgeon已更正,谢谢。忘记了0%N=0。很抱歉,我看错了问题,问题已更新。@ShawnSmith更新了问题后,我的代码应该可以工作。几乎,它会上升到256,所以您需要一个大小不太大的-&您也需要检查范围。很抱歉,我看错了问题,问题已更新。
unit >>= ((size & -253) == 2) ? 1 : 0;
(size & (~255 | 3)) == 2   (simplifies to)   (size & -253) == 2.