-1

こんにちは私は数値を取り、そのバイナリ表現と一緒にそれを出力するメソッドを作成しています。問題は、私のメソッドが正の数の場合はすべて0を出力し、負の数の場合はすべて1を出力することです。

private static void display( int number ){

        System.out.print(number + "\t");        
        int mask = 1 << 31;

        for(int i=1; i<=32; i++) {
            if( (mask & number) != 0 )
                System.out.print(1);
            else
                System.out.print(0);


            if( (i % 4) == 0 )
                System.out.print(" ");

        }

    }

私はそれを手に入れました:これはうまくいきます:

/**
     * prints the 32-bit binary representation of a number
     * @param number the number to print
     */
    private static void display( int number ){
        //display number and a tab
        System.out.print(number + "\t");

        //shift number 31 bits left
        int mask = 1 << 31;

        //loop and print either 1 or 0
        for(int i=31; i>=0; i--) {
            if( ((1 << i)&number) != 0)
                System.out.print(1);
            else
                System.out.print(0);

            //every four bits print a space
            if( (i % 4) == 0 )
                System.out.print(" ");            

        }
        //print new line
        System.out.println();
    }
4

2 に答える 2

5

マスクを更新するのを忘れました:

    for(int i=1; i<=32; i++) {
        if( (mask & number) != 0 )
            System.out.print(1);
        else
            System.out.print(0);


        if( (i % 4) == 0 )
            System.out.print(" ");

        mask = mask >> 1;
    }
于 2010-05-06T20:13:25.123 に答える
2

質問の文章は何度も編集されているので、質問の内容がわかりにくいですが、ここにいくつかの発言があります。

符号付きと符号なしのシフトについて

質問の1つのリビジョンには、次の行が含まれています。

int mask = 1 << 31;

1つの答えは、欠けていたのは次の行であることを示唆しています:

mask = mask >> 1;

これは実際には機能しません。これ>>は符号付きシフトであり、maskこの目的では正しくない値になる可能性があります (空のビットは1s で埋められるため)。負の数はすべて 32 ビットに変換されます1

必要なのは符号なし右シフトです。

mask >>>= 1;

簡潔にするために複合割り当てが使用されていることに注意してください。符号なし右シフト>>>は、空のビットを で埋めます0。ここで使用されているようにmask、この問題に必要なビット セットが常に 1 つだけになるようにします。

こちらもご覧ください

同様の質問


代替ソリューション

実際には、32 ビットintを 32 ビットに変換し、4 ビットのグループに分割する、より簡単なソリューションがあります。

static String zeroes(int length) {
    return (length <= 0) ? ""
      : String.format("%0" + length + "d", 0);
}
//...

int num = 8675309;

// convert to binary
String s = Integer.toBinaryString(num);
System.out.println(s);
// prints "100001000101111111101101"

// fill in leading zeroes
s = zeroes(Integer.SIZE - s.length()) + s;
System.out.println(s);
// prints "00000000100001000101111111101101"

s = s.replaceAll("(?!$)(?<=\\G.{4})", " ");
System.out.println("[" + s + "]");
// prints "[0000 0000 1000 0100 0101 1111 1110 1101]"

これが宿題であるとしても、ここで使用されるさまざまなテクニックは依然として教育的なものでなければなりません。

こちらもご覧ください

于 2010-05-07T03:17:59.237 に答える