Java 如何更快地将长数组保存为反向十六进制数?

Java 如何更快地将长数组保存为反向十六进制数?,java,android,performance,hex,Java,Android,Performance,Hex,我最近开始在android平台上开发。我正在开发一个应用程序,为了寻找一些线索,我正在查看他们提供的android音乐应用程序示例。 在应用程序中,在他们保存当前播放列表的地方,他们给出了一个我无法理解的论点。参数和代码如下所示: if (full) { StringBuilder q = new StringBuilder(); // The current playlist is saved as a list of "reverse hexadecimal

我最近开始在android平台上开发。我正在开发一个应用程序,为了寻找一些线索,我正在查看他们提供的android音乐应用程序示例。
在应用程序中,在他们保存当前播放列表的地方,他们给出了一个我无法理解的论点。参数和代码如下所示:

if (full) {
        StringBuilder q = new StringBuilder();

        // The current playlist is saved as a list of "reverse hexadecimal"
        // numbers, which we can generate faster than normal decimal or
        // hexadecimal numbers, which in turn allows us to save the playlist
        // more often without worrying too much about performance.
        // (saving the full state takes about 40 ms under no-load conditions
        // on the phone)
        int len = mPlayListLen;
        for (int i = 0; i < len; i++) {
            long n = mPlayList[i];
            if (n < 0) {
                continue;
            } else if (n == 0) {
                q.append("0;");
            } else {
                while (n != 0) {
                    int digit = (int)(n & 0xf);
                    n >>>= 4;
                    q.append(hexdigits[digit]);
                }
                q.append(";");
            }
        }  

然后“q”保存在SharedReferences中。以类似的方式,他们稍后使用这些十六进制数字检索列表。如果有人能解释一下这个代码片段的意义,我将不胜感激。我的意思是,这与直接使用长值创建字符串有什么不同

他们在这里所做的是一个非常简单的算法,以尽可能快地显示数字。对于每个数字,他们需要执行以下操作:

>>
&
append character looked up from array
然后,对于每个数字,它们附加一个
在末尾

这些操作中的每一个都非常快,因此最终的结果是从内存中提取长数据,并将其以紧凑的形式以尽可能最佳的速度以字符串形式输出

它是反十六进制的,因为最小的数字首先显示


这将比Java中内置的通用算法更快,尽管我会感到惊讶的是,如果节省的数量很大,除非他们节省了大量的数字。

特别是,他们屏蔽了底部的4位,并写入十六进制数字(低阶数字)-
int digit=(int)(n&0xf)然后右移4位,写出高位
n>>>=4。非常快。@TimB感谢您快速、易懂的回复。我刚刚读了一些关于这些运算的书,读到逐位运算比普通的数学运算要快得多。但我想知道,如果说数组中有50个长数字,这会有多大区别?@Simon感谢您进一步解释。干杯相对而言,我希望它会更快。从绝对值来看,虽然我预计节省的钱只有50英镑,但实际上并不是很多。你唯一知道的方法就是测量它。没有指标,其他一切都是猜测。
>>
&
append character looked up from array