将字符串转换为二进制?

时间:2013-10-27 04:08:32

标签: java

好的,一位朋友帮我解释了这段代码。除了一件事,我理解其他所有事情以及它为什么会这样做。这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);
      }



      }

}

3 个答案:

答案 0 :(得分:1)

128是2 ^ 7功率,这意味着二进制它是10000000.字节由8位组成。因此,在使用128的行上,您正在进行按位AND以获得最高位。 (然后在下一行,您将值向左移一位并重复,因此您连续从左到右获取每个位值。)

答案 1 :(得分:0)

128是二进制的1000 0000,因此它是字节的最高位(MSB)。 MSB是左边的fisrt位。由于代码打印从MSB到LSB的位,每次循环迭代根据AND(&amp;)的结果打印1或0,其中值仅设置了MSB位(128),并将值向左移位一位。

答案 2 :(得分:0)

正如其他人所说,128只是MSB中1的掩码。

如果你有一个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...