1

これが状況です...私は32ビットのバイナリ文字列を含むバイナリファイルを持っています(例:1011011100100110101010101011010)これを整数に変換したい...私はすでにparse-Intでそれをやろうとしましたが、最も重要な値は 1 です。私は負の数を返しますが、それは望ましくありません...次に、parse-Long で試してみましたが、問題ありませんでしたが、その後、この整数を取得したら、それを別のクラスに送信する必要があります。整数のみを受け取ることができます。その結果、long から int にキャストすると、再び負の整数が返されます。 string ) しかし、それを変更変換する方法がわかりません。知らないことが多いマスクの話です。

コードは次のとおりです。

    private static String intToBitString(int n) {
         StringBuffer sb = new StringBuffer();
         for (int mask = 1 << 31; mask != 0; mask = mask >>> 1)
             sb.append((n & mask) == 0 ? "0" : "1");
         return sb.toString();
     }

前もって感謝します...

4

1 に答える 1

2

最上位ビットが 1 に設定された整数は、ビット数に関係なく負の整数です。文字列に見出しのゼロを追加するか、ビットごとの AND (x & 0x7FFFFFFF) で最上位ビットをクリアするだけです。java int には 31 ビットの正の整数しか格納できません。

そのような値を long に割り当てても (long x = 0xFFFFFFFF、-1 になります)、符号ビットが拡張され、負の long になります (0x0FFFFFFFFL を記述して、予想される 00000000FFFFFFFF を long に割り当てることができます)。これが望ましくない動作である場合は、上位ビットをクリアする必要があります。

    int a = 0x80000007; // High bit 1 - negative!
    long b = a; // Sign expands!
            // Clearing high bits (mind leading 0 and 
            // the long type suffix (L) in the hex constant:
    long c = b & 0x0FFFFFFFFL; 
    System.out.println(a + ":" + Long.toHexString(b) + ":"
            + Long.toHexString(c));

出力: -2147483641:ffffffff80000007:80000007

于 2012-12-05T14:47:23.967 に答える