Java Print Binary Number с использованием битового оператора [закрыто
-
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;
}
Другие советы
Текст вопроса был отредактирован много раз, поэтому трудно сказать, что такое вопрос, но вот некоторые замечания.
На подписанных против сдвига без знака
Одно пересмотр вопроса содержит эту строку:
int mask = 1 << 31;
Один ответ предлагает, что то, что было пропущено, это эта линия:
mask = mask >> 1;
Это на самом деле не будет работать, потому что >>
это подписанный сдвиг, и приведет к неправильному mask
Значение для этой цели (так как опустошенные биты заполнены 1
s). Любое отрицательное число будет преобразовано в 32 бита, все 1
.
Тременная необходима, это не подписированная правая смена.
mask >>>= 1;
Обратите внимание, что составное назначение использовалось для краткости. Беззначный правый сдвиг >>>
заполняет опорожняет биты с 0
. Отказ Как здесь используется, это гарантирует, что mask
Всегда будет иметь только один битовый набор, который является то, что требуется для этой проблемы.
Смотрите также
Подобный вопрос
- Программа с Java
- Аналогичное домашнее задание
Альтернативное решение
На самом деле есть более простое решение для преобразования 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]"
Даже если это домашнее задание, разные методы, используемые здесь, все равно должны быть обучающимися.