【问题标题】:Is there some sort of functionality in Java that converts a char into a bit?Java中是否有某种功能可以将字符转换为位?
【发布时间】:2021-12-06 15:06:08
【问题描述】:

我正在尝试找到一种将 char(前提是 char 只能是“0”或“1”)转换为 Java 中的实际位的方法。我不确定 Java 是否为此提供了一些内置功能,或者是否有可以实现的算法。

我需要实现以下类:

public void writeBit(char bit) {
//PRE:bit == '0' || bit == '1'
    try {
    
    } catch (IOException e) {
        System.out.println(e);
    }
}

我无法以任何方式更改方法结构。我正在实现霍夫曼编码,并有一个字符串数组,代表输入文件中每个字符的编码。例如,'A' 或 array[65] 包含字符串:“01011”。因此,如果我在文件中看到字母 A,我需要使用 writeBit 将 A 的相应字符串写入二进制文件。每次达到 8 位(一个字节)时,我都会调用 writeByte 将这 8 位发送到二进制文件,然后将某种计数器变量重置为 0 并继续。

我坚持的是我应该如何将 char 位转换为实际位,以便可以正确地将其写入二进制文件。

【问题讨论】:

  • 呃,我不明白。你的预期结果是什么?输入?输出?
  • @Darkman 我会为这个问题添加更多细节。我道歉
  • 您需要一个具有类级别变量的类,该变量跟踪已累积的位并最终将结果字节刷新到文件
  • 如果要将ASCII字符存储为5位,那意味着大写和小写是一样的吧?像这样('A' - 0x60) & 0x1F == ('a' - 0x60) & 0x1F

标签: java encoding binary bit


【解决方案1】:

Java 没有表示单个位的原始数据类型。在许多硬件架构上,甚至不可能以这种粒度访问内存。

当您说“一个实际位”时,我只能假设您的意思是一个整数值,即 01,而不是 char'0''1'。执行这种转换的方法有很多,其中包括:

  • byte the_bit = bit - '0';。这利用了 char 是整数类型,并且十进制数字 0 和 1 在 Java 中使用连续字符代码编码的事实。

  • byte the_bit = (bit == '0') ? 0 : 1;。这只是明确测试bit 是否包含值'0',如果是,则评估为0,否则评估为1

从那里开始变得更加复杂,例如:

  • byte the_bit = Byte.parseByte(String.valueOf(bit));。这会将char 转换为(仅)包含该字符的字符串,然后将其解析为字节的字符串表示形式。

以上所有内容都在一定程度上依赖于给定的前提条件:bit 除了'0''1' 之外没有任何值。


话虽如此,我认为这样的任何事情都可能是实现 Huffman 编码的错误方法,因为 Java Strings 不太可能是所涉及的 bit 字符串的重量级表示。

【讨论】:

    【解决方案2】:

    您可以使用Integer.parseInt(String s, int radix)Integer.parseUnsignedInt(String s, int radix) 与基数2,将“二进制数字字符串”转换为内部int java 整数形式。

      public static void main(String[] args) {
        int num = Integer.parseInt("101010", 2);
        // print 42
        System.out.println(num);
      }
    
    

    反过来用Integer.toBinaryString(int i)方法你可以生成二进制字符串表示:

      // print 101010
      System.out.println(Integer.toBinaryString(42));
    

    同样你可以使用Byte.parseByte(String s, int radix)来解析一个字节:

      public static void main(String[] args) {
        byte num = Byte.parseByte("101010", 2);
        // print 42
        System.out.println(num);
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2012-03-24
      • 2019-06-03
      相关资源
      最近更新 更多