18

非常に単純なタイプの暗号化用のデコーダーを作成しようとしています。0 ~ 255 の数値をスキャナーで入力し、ビットを反転してから文字に変換して印刷します。

たとえば、数値 178 は文字 "M" に変換する必要があります。

178 は 10110010 です。

すべてのビットを反転すると、01001101 が得られます。これは、77 または文字としての「M」です。

私が抱えている主な問題は、私が知る限り、Java は符号なしバイトをサポートしていないということです。値を int または short として読み取ることができますが、余分なビットが原因で、変換中に値がオフになります。理想的には、ビットごとの補数演算子を使用できますが、符号付きの数値でこれを行うと、最終的に負の値になると思います。これにどのようにアプローチすべきかについてのアイデアはありますか?

4

7 に答える 7

17

単純に 1 の補数を使用し、2 進数の and を使用して他のビットを取り除きます。

public class Conv {
    public static void main(String[] args) {
        int val = 178;
        val = ~val & 0xff;
        System.out.println((char) val);
    }
}
于 2010-07-24T10:42:54.267 に答える
12
~n & 0xff

~すべての数値演算が行うように、補数を実行し、暗黙的に整数に変換し& 0xff、下位 8 ビットを除くすべてをマスクして、符号なしの値を再び整数として取得します。

ビットの値ではなく順序を逆にするために、最初にあなたの質問を別の方法で読みましたが、これが答えでした。

使用できますInteger.reverse()(テストされていません):

Integer.reverse(n << 24) & 0xff
于 2010-07-24T10:42:23.363 に答える
6

Java でのビット操作は に対して定義されてintいるため、intではなくbyte. Scanner.nextIntではなくを使用できますScanner.nextByte。ユーザーの入力を検証して、入力されたすべての整数が 0 ~ 255 の範囲内であることを確認し、範囲外の数値が検出された場合は適切なエラー メッセージを表示する必要があります。

数値を整数に格納したら、最下位 8 ビットを反転して 0xff で XOR できます。これは、0 から 255 までのすべての入力に対して期待どおりに機能するはずです。

x ^= 0xff;

例:

String input = "178 0 255";
Scanner s = new Scanner(input);
while (s.hasNextInt()) {
    int x = s.nextInt();
    if (x < 0 || x > 255) {
        System.err.println("Not in range 0-255: " + x);
    } else {
        x ^= 0xff;
        System.out.println(x);
    }
}

結果:

77
255
0
于 2010-07-24T10:39:11.523 に答える
2

Java がこれをサポートしている場合は、それをより大きな型のビットごとの補数に読み込んでから、不要なビットをビットマスクで除外できます。

int x = [your byte];
x = ~x & 0xFF;
于 2010-07-24T10:38:54.707 に答える
0

これを行う最も簡単な方法は、次の 3 つの段階です。

  1. 値を int (Java では 32 ビット) として読み取ります。負として読み取られる可能性がありますが、とにかく下位 8 ビットのみを気にします。int i = scanner.nextByte();
  2. ビットごとの演算子を使用して int として反転を行います(あなたが言うように、上位ビットとして1が得られます:i = ~i;
  3. 論理 AND で上位ビットを失う:i = i & 0xFF;

次に、結果を文字として使用します (Java では実際には 16 ビットですが、そのうちの 8 ビットのみを使用します)。

char c=(char)a;
System.out.println(c); 

すべて一緒に:

int i = scanner.nextByte(); // change this to nextInt() depending on file format
i = ~i;
i = i & 0xFF;
char c=(char)a;
System.out.println(c); 
于 2010-07-24T10:38:22.703 に答える
-1

バイナリ表現(00000000から11111111)でソートされたJavaバイトは次のとおりです。

0、1、2、..、126、127、-128、-127、..、-2、-1

00000000は0、11111111は-1

反転0は-1、反転1は-2、...、反転127は-128です。したがって、Javaバイトのビットを反転したい場合は、反対の符号のバイトを取得して1を引く必要があります。

byte myByte = 123;
byte myInvertedByte = -myByte-1;
于 2012-01-26T15:14:42.087 に答える
-1
private byte reverseBitsByte(byte x)
{
    int intSize = 8;

    byte y = 0;
    for (int position = intSize - 1; position >= 0; position--)
    {
        y += ((x & 1) << position);
        x >>= 1;
    }
    return y;
}
于 2014-07-08T17:53:32.583 に答える