2013-10-27 3 views
3

Хорошо, друг немного помог мне с этим кодом. Я понимаю, что все остальное делает и почему оно делает это, за исключением одного. Откуда взялось это 128? Кроме того, эта программа запускается, вытягивает строку из файла, преобразует ее в двоичную, но берет все пробелы, так что, когда вы переводите двоичный файл обратно в строку, это все одно слово. Итак, что такое 128 и что я могу сделать, чтобы сохранить пробелы?Преобразование строки в двоичную?

/* ** * ** * ** * ** * ** * ** * ** * ** * * * * ** * * Я исправил его, спасибо за помощь, ребята! * * Я изменил код, чтобы вы могли видеть, как я его исправил. * * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** */

  public static void main(String[] args) { 

      String text = "My string to binary works too"; 

      byte[] bytes = text.getBytes(); 
      StringBuilder binary = new StringBuilder(); 

      for (byte b : bytes){ 
      int val = b; 
      for (int i = 0; i < 8; i++){ 
      binary.insert(0, (val & 1) == 0 ? 0 : 1); 
      val >>>= 1; 
      } 
      binary.insert(0, ' '); 
     System.out.print(binary); 
     } 



     } 

}

+0

Самый двоичное значение 128 ...! Так может получиться – gowri

+0

Наивысшее двоичное значение не 128 ?? – Joey

+0

значение максимального значения в байте составляет 128.но я не понимаю, что здесь делает 128. – Joey

ответ

0

Как говорили другие, 128 - это всего лишь небольшая маска из 1 в MSB.

Следуя логике через если у вас есть байт, который 10011001:

10011001 & 10000000 = 10000000 != 0 
11011001 << 1 = 00110010 
00110010 & 10000000 = 00000000 == 0 

and so on... 

Вот альтернативную логику, которая достигает то же самое, но с инверсией (маска в LSB) и, возможно, делает более непосредственный смысл:

int val = b; 
for (int i = 0; i < 8; i++) 
{ 
    binary.insert(0, (val & 1) == 0 ? 0 : 1); 
    val >>>= 1; 
} 
binary.insert(0, ' '); 

Следуя этой логике через вас есть:

10011001 & 00000001 = 00000001 != 0 
11011001 >>> 1 = 01101100 
01101100 & 00000001 = 00000000 == 0 

and so on... 
+0

Я собираюсь использовать это. спасибо человеку – Joey

+0

Добро пожаловать. :) Хотя я понимаю использование 128, использование 1 имеет больше смысла для меня и работает для любой длины слова. 128 работает только для байта. – Radiodef

+0

Вместо того, чтобы указывать пространство, кто-то может рекомендовать вообще не использовать Scanner. InputStream существует именно для этого. – Basilevs

1

128 is 2^7 power, что означает, что в двоичном коде 10000000. Байт состоит из 8 бит. Итак, на линии, где используется 128, вы делаете побитовое И, чтобы получить наивысший бит. (Затем на следующей строке вы смещаете значение на один бит влево и повторяете, так что вы последовательно получаете каждое значение бита слева направо.)

+0

Хорошо, это имеет смысл. Спасибо – Joey

+0

Как насчет знака байта? – Basilevs

+1

@Joey Для справки вы теряете пробелы, потому что используете 'next()' из 'Scanner', который использует пробел как разделитель. –

0

128 - это 1000 0000 в двоичном формате, поэтому это самый старший бит (MSB) байта. MSB - бит fisrt слева. Поскольку код печатает биты от MSB до LSB, каждая итерация цикла печатает 1 или 0 в зависимости от результата AND (&) со значением, имеющим только бит бит MSB (128), и сдвигает значение влево на один бит.

Смежные вопросы