3

まず第一に、私はJavaが(非)署名を知らないという事実を認識しています

私の質問は、次の状況に関するものです。

があると想像してくださいint i = -1 // ( == 0b1111111_11111111_11111111_11111111)。ここで、これをバイト値を表す long に「変換」したいと思います。たとえば、この具体的なケースでは: long l = 0xFFFFFFFF // ( == 0b1111111_11111111_11111111_11111111).

私の質問は、上記の例lからどのように取得できるかです。i

4

3 に答える 3

4

あなたはビット単位の数学を使うことができます、以下のコードから自明であるはずです。わからない場合はコメントで聞いてください。

public class LongConversion {
  public static void main(String args[]) {
    for (int i = -1; i > -40; i -= 9) {
      // THIS IS THE IMPORTANT LINE, THE REST IS JUST FOR DEMONSTRATION
      long l = 0x00000000FFFFFFFFl & (long) i;

      System.out.println("Original i: " + i);
      System.out.println(Integer.toHexString(i));
      System.out.println("Longed i: " + l);
      System.out.println(zeroLong(l));
      System.out.println();
    }
  }

  public static String zeroLong(long l) {
    return String.format("%16s", Long.toHexString(l)).replace(' ', '0');
  }
}

このコードは以下を出力します:

Original i: -1
ffffffff
Longed i: 4294967295
00000000ffffffff

Original i: -10
fffffff6
Longed i: 4294967286
00000000fffffff6

Original i: -19
ffffffed
Longed i: 4294967277
00000000ffffffed

Original i: -28
ffffffe4
Longed i: 4294967268
00000000ffffffe4

Original i: -37
ffffffdb
Longed i: 4294967259
00000000ffffffdb
于 2012-11-29T16:32:18.617 に答える
1

Java 8 では、署名されていない型を処理するためのサポートが追加されました。この場合、durron597 の answerInteger.toUnsignedLongと同等の を使用できます。

long unsigned = Integer.toUnsignedLong(myIntger);
于 2015-09-02T15:52:57.223 に答える
-1

APIを使用して作業を行うことができます。

long l = Long.parseLong(Integer.toBinaryString(i), 2);

toBinaryString()javadocによるメソッド

整数引数の文字列表現を基数2の符号なし整数として返します。


この手法はビットマスクを使用するほど高速ではありませんが、「低速」ではありません。

私は(通常の)PCでいくつかの適切なタイミングを実行しましたが、この変換には270ナノ秒しかかかりませんでしたが、これは私の本ではまだかなり高速です。

また、ビットカンフーの代わりにAPIを使用して作業を行います。これは、読みやすく、ある程度自己文書化されています。

于 2012-11-29T16:32:15.730 に答える