2013-03-06 17 views
6

ディスクから大きなファイルを読み込んでいます。そのファイルには数字だけが含まれていて、普通のASCII形式でエンコードされています。現時点では、私はチャンクで読んでいますし、このような何かをやって:byte []文字列を整数値に変換する速い方法

byte[] token; // bytes representing a bunch of numbers 
int n = Integer.parseInt(new String(token)); 

言い換えれば、私は文字列に変換して文字列を整数に解析しています。代わりにシフトやバイナリ算術などの高速演算を使用する方法があるかどうかを知りたいですか?

私はこれがより速くなると思われます。たとえば、数字1,2,3の生のバイトは49,50,51です。ハッキングのアイデアは?

+0

? – Perception

+0

負の整数はありますか? – kuriouscoder

+0

@Perception:それについて心配する必要はなく、私は既にデリミネーションを処理しました。私は可能な限り速くバイト[]チャンクを分割しています。 – Dave

答えて

7
int n=0; 
    for(byte b : token) 
     n = 10*n + (b-'0'); 
+0

うわー、それは良いです:)しかし、注文に依存します。 –

+0

ASCII文字のストリームを読み込んだ場合、その注文はすでに処理されています。そうでなければ、何か不足していますか? – jdb

+0

ここにはエンディアンの問題はありません。しかし、いくつかの文化は、最初に一番下の数字を書くだろうか?アラビア語で言うと、私たちは 'عام2013هوعامجيد'のようなものを見ます。私たちはアラビア語が右から左に書かれていることを知っていますので、ここではアラビア語の数字は最初に一番小さい数字で書かれていますか?いい考えはありません。 – irreputable

2

10進数で正確に2進演算を行うことはできませんが、10進演算を行うことはできます。上位の桁が最初に来ると仮定すると:

byte[] token; 
long n = 0; 
long pow = 1; 
for(int i = token.length - 1; i >= 0; i--) { 
    n += (token[i]-48) * pow; 
    pow *= 10; 
} 
+0

ありがとうございます。小数点演算の良い点。 – Dave

0

は試す

byte[] a = { 1, 2, 3 }; 
    for (int i = 0; i < a.length; i++) { 
     a[i] += '0'; 
    } 
    int n = Integer.parseInt(new String(a)); 
    System.out.println(n); 

出力番号が入力ファイルで区切られている方法

123 
+0

これは私の元のアプローチと本質的に同じです。私は、新しい文字列を作成し、それをintに構文解析するという余分なオーバーヘッドを望んでいませんでした。 – Dave

関連する問題