Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 最接近于20的整数值_Java_Division - Fatal编程技术网

Java 最接近于20的整数值

Java 最接近于20的整数值,java,division,Java,Division,如果我有一个大于20的数字,但可以被2平分,没有余数,我想确定哪个数字最接近20。例如: 对于2048年,除以2足够多的时间,我会得到16,这是我能得到的最接近20。如果数字为800,则最接近的数字为25 我可以写一个循环,然后继续划分和比较范围,然后选择最接近的值。是否有一种更简单的方法,可能通过移位位 编辑:当我说它平均除以2时,我的意思是它也一直除以2。70个数字只能平均地分成35个。像2048或1024这样的数字将一直等分到2 样本编号:204811920160015361080..64

如果我有一个大于20的数字,但可以被2平分,没有余数,我想确定哪个数字最接近20。例如:

对于2048年,除以2足够多的时间,我会得到16,这是我能得到的最接近20。如果数字为800,则最接近的数字为25

我可以写一个循环,然后继续划分和比较范围,然后选择最接近的值。是否有一种更简单的方法,可能通过移位位

编辑:当我说它平均除以2时,我的意思是它也一直除以2。70个数字只能平均地分成35个。像2048或1024这样的数字将一直等分到2


样本编号:204811920160015361080..64035232030176。这些是相机的典型图像大小。

如果您的输入号码是
x
,我想您需要
x/2^[(log x/14)/log 2]
,假设您希望您的目标号码在
[14,27]
的间隔内

在java代码中,
Math
log
函数将派上用场(尽管以2为底的对数更好),并且您还需要整数强制转换(或者以某种方式找到小于
[]
中表达式的最大整数)


它的作用是:让
x
作为您的输入,
y
作为您想要查找的数字。然后,
x=y*2^n
表示未知的
n
,而
y
大约为20(见上文)。显然,
n
x/y
的以2为底的对数。现在,如果你选择尽可能最小的
y
,称之为
y'
,那么
x/y'
的以2为底的对数的整数部分仍然是我们要寻找的
n
,除非
x/y'
x/y
的差异大于2,而假设重复除以2则不能。因此,我们有
n
,因此
y=x/2^n
如果您想使用移位,可以从以下内容开始:

public static int func2(int val) {
    int min = Integer.MAX_VALUE;
    int close = 0;
    while (val > 1) {
        val = val >>> 1;
        if (Math.abs(val - 20) < min) {
            min = Math.abs(val - 20);
            close = val;
        }
    }
    return close;
}


public static void main() {
    for ( int i : new int []{2048, 1920, 1600, 1536, 1080, 640, 352, 320, 176}) {
       System.out.println( i + " -> " + func2( i ));
    }
}

实际上,您希望修剪所有尾随的零位,直到得到一个大于13的数字

另一种方法是修剪所有的零,如果结果太小,将它们加回去

public static long func(long num) {
    if (num <= 26) return num;
    long trimZeros = num >>> Long.numberOfTrailingZeros(num);
    while(trimZeros <= 13) trimZeros <<= 1;
    return trimZeros;
}
公共静态长函数(long num){
if(num>>Long.numberoftrailingzero(num);

while(trimzero)您需要检查每个步骤上的值是否为偶数,因此在任何情况下您都需要一个循环。对于那些不能被2除而没有余数的数字(例如奇数,如35?),您将如何处理这些数字他只想做偶数。除了满足我的好奇心之外,没有其他理由……这有什么用?天哪,答案是42!除以2,你得到21,这是最接近20的整数,而不是20。请解释你的公式。我想知道up选民是否理解这个公式,或者只是想“嗯,看起来很聪明!”。最接近20和大约20不一样。例如,对于输入
70
算法必须产生
35
Erm…“看起来很聪明”?可能更像“看起来像高中数学的应用”;-)无论如何,键入解释所花的时间比发布答案和你的评论之间的时间要长得多。我不明白这是怎么回事。我输入了一些数字,但没有得到任何整数值。甚至不接近。与除以2相比有什么优势吗?我想,一个聪明的编译器可能会用移位来代替除以2。@Chris He asked对于移位的可能性,我看不出有什么优势。是的,你的答案是可以的。我只是想知道这是否有什么区别。实际上我只是想避免循环。arne的解决方案就是这样。func(2048)会像预期的那样返回32而不是16。
public static long func(long num) {
    if (num <= 26) return num;
    long trimZeros = num >>> Long.numberOfTrailingZeros(num);
    while(trimZeros <= 13) trimZeros <<= 1;
    return trimZeros;
}