Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 getChar函数是如何工作的? private static char[]getChars(inti){ char buf[]=新字符[32]; int-q; 对于(int j=31;j>=0;j--){ q=(i*52429)>>>(19); int r=i-((q_Java_Algorithm_Binary - Fatal编程技术网

Java getChar函数是如何工作的? private static char[]getChars(inti){ char buf[]=新字符[32]; int-q; 对于(int j=31;j>=0;j--){ q=(i*52429)>>>(19); int r=i-((q

Java getChar函数是如何工作的? private static char[]getChars(inti){ char buf[]=新字符[32]; int-q; 对于(int j=31;j>=0;j--){ q=(i*52429)>>>(19); int r=i-((q,java,algorithm,binary,Java,Algorithm,Binary,如果搜索源代码,您将找到该数字的第二个实例: //我使用“不变乘法除法”技巧 //加速Integer.toString。我们尤其希望 //避免除以10。 // //“技巧”具有大致相同的性能特征 //作为非JIT VM上的“经典”Integer.toString代码。 //该技巧避免了.rem和.div调用,但代码较长 //路径,因此由调度开销控制 //JIT情况下,调度开销不存在,并且 //“技巧”比经典代码快得多。 // //TODO-FIXME:将(x*52429)转换为等效移位加法 //

如果搜索源代码,您将找到该数字的第二个实例:

//我使用“不变乘法除法”技巧
//加速Integer.toString。我们尤其希望
//避免除以10。
//
//“技巧”具有大致相同的性能特征
//作为非JIT VM上的“经典”Integer.toString代码。
//该技巧避免了.rem和.div调用,但代码较长
//路径,因此由调度开销控制
//JIT情况下,调度开销不存在,并且
//“技巧”比经典代码快得多。
//
//TODO-FIXME:将(x*52429)转换为等效移位加法
//顺序。
//
//RE:使用乘法进行不变整数除法
//蒙哥马利P格拉伦德
//ACM PLDI 1994
//

因此,你的问题的答案可以在T Gralund,p Montgomery的书中找到。

这个方法属于什么类?@Seelenvirtuose whoops,OP updated。它在java.lang.Integer中。我在
java.lang.Integer
中只看到一个方法
静态void getChars(int i,int index,char[]buf)
(JDK7和JDK8).困惑…@Seelenvirtuose在JDK8中,它位于第456行:(注意它是一个
private
方法)@Seelenvirtuose问题说显示的代码“基于java.lang.Integer.getChars(int)的一部分”。问题是询问有关幻数的问题。
52429
。我只是简单地指出,在JDK8中,该幻数位于第456行。而作为,幻数来自一本书。但为什么最大值限制在81920?@QuestionEverything关于原因,请阅读本书。但是,请注意,在JDK8中,它仅限于
65536
。请参阅comm第453行的ent:@QuestionEverything:因为
81919*52429
只适合32位,但
81920*52429
不再适合。
private static char[] getChars(int i) {
    char buf[] = new char[32];
    int q;
    for (int j = 31; j >= 0; j--) {
         q = (i * 52429) >>> (19);
         int r = i - ((q << 3) + (q << 1));
         buf[j] = (char) (r + '0');
         i = q;
         if (i == 0)
             break;
    }

 return buf;
}