ビットワイズオペレーターを使用したJava印刷バイナリ番号[閉じた
-
03-10-2019 - |
質問
こんにちは私は数字を取り、そのバイナリ表現とともにそれを印刷する方法を作成しています。問題は、私の方法がすべての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();
}
解決
マスクを更新するのを忘れました:
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;
}
他のヒント
質問のテキストは何度も編集されているため、質問が何であるかを伝えるのは難しいですが、ここにいくつかの発言があります。
署名されたvs Unsigned Shift
質問の1つの改訂には、この行が含まれています。
int mask = 1 << 31;
1つの答えは、欠落していたのはこの行であることを示唆しています。
mask = mask >> 1;
これは実際には機能しません >>
署名されたシフトであり、間違ったものになります mask
この目的のための価値(空になったビットはで満たされているので 1
s)。負の数は32ビットに変換されます。 1
.
必要なのは、署名されていない正しいシフトです。
mask >>>= 1;
複合割り当ては簡潔に使用されていることに注意してください。署名されていない正しいシフト >>>
空のビットを埋めます 0
. 。ここで使用されているように、それはそれを保証します mask
常に1つのビットセットしかありません。これがこの問題に必要なものです。
参照してください
同様の質問
- Javaでプログラム
- 同様の宿題の割り当て
代替ソリューション
実際には32ビットを変換するためのより簡単なソリューションがあります int
4ビットのグループに分離された32ビットに。
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]"
これが宿題であっても、ここで使用されるさまざまな手法は依然として教育的でなければなりません。
参照してください
所属していません StackOverflow