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