バイトとして格納されている符号なしの 32 ビット、64 ビットのプリミティブがあります。Javaでそれらを使用する必要があります。だから私はそれらをバイトから一緒に構築することを考えました。まず、すべてが正しく計算されていることを確認するために、ランダムなバイトで遊んでいます。しかし、私はいくつかの問題に遭遇しました:
// input: array of 4 bytes (unsigned int 0 to 4,294,967,295)
// output: double 0.0 to 1.0 (0 -> 0.0, 2,147,483,647 ~> 0.5, 4,294,967,295 -> 1.0)
byte[] bytes = new byte[100];
(new Random()).nextBytes(bytes); // randomize bytes
long a = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0];
double b = 1.0 * (a & 0xffffffffL) / 0xffffffffL;
System.out.println(bytes[3] + "," + bytes[2] + "," + bytes[1] + "," + bytes[0]);
System.out.println(a);
System.out.println(b);
出力 b はほとんどの場合 1.0 に近く、最大 unsigned int に近い値です。私は何を間違っていますか?必要な動作を取得するにはどうすればよいですか? また、 QWORD の 8 バイトを使用して同じ (正しい計算) を行うにはどうすればよいですか?