【问题标题】:ascii char representation in Java?Java中的ascii char表示?
【发布时间】:2012-09-15 18:54:37
【问题描述】:

如果我使用单个 int 来表示 ascii 字符集,如何使用它来减少 8 倍的存储空间?与 256 个布尔值的数组相比?单个 int 也像位向量一样工作。

java 中的布尔值将占用 1 位,因为它只能表示真或假值。例如,如果我有一个布尔值数组。 boolean[] char_set = new boolean[256] 这将占用 256 位对吗?我正在阅读,如果我使用像位向量这样的单个 int,这意味着我可以使用 32 位来覆盖 256 个值。我想这是减少了 8 倍。但是为什么下面的代码有效?

它正在检查字符串中是否有任何重复项。他们假设一个 ascii 字符集。 Str 是一些字符串。

int checker = 0;
for(int i=0;i<str.length();i++)
{
  int val = str.charAt(i) - 'a';
  if(checker& (1<<val)) > 0)
  {
     return false;
  }
  checker |= (1<<val);
}
  return true;
}

有人能具体解释一下在这种情况下位向量逻辑是如何工作的吗?他们假设字符串包含小写字符。

【问题讨论】:

  • 稍微阐述一下这个问题!不太清楚你在问什么!
  • 一个建议是使用 unicode 来存储字符串和 char 数据。 Ascii 已经非常过时了,并且使您的代码和程序的可移植性降低。
  • “代表一个字符集”是什么意思?

标签: java


【解决方案1】:

int 是 32 位,而不是 256 位。仅代表一组 256 个可能的项目是不够的。你需要8个。我不确定你的意思是你只能使用 32 位。

不清楚你在循环什么——str 是什么?从 0 到 255 的所有 256 个值?我很怀疑,因为你减去了'a'。您的值域是否只有 32 个可能的字符?然后确定你可以使用32位。但是 256 是从哪里来的呢?

您的掩码条件需要为 != 0 才能用于最高位集。

(boolean 的“真实”大小对 Java 程序员来说是不透明的。实际上,你会发现它不是 1 位(机器不是可位寻址的),甚至不是 1 字节.Java实际上使用了一个完整的32位字。但这与你的问题并不真正相关。)

【讨论】:

  • 您可以用 int 表示 2^32 个可能的值。 str 是一个字符串,它只能包含来自 ascii 字符集的值。
  • 当然。但是您似乎将其用作位集,以指示事物的存在/不存在。这样的集合确实有 2^32 种可能的状态,但是,它可以在集合中表示的对象宇宙有 32 个元素。您的代码将无法工作,因为移位可能大于 32,它只会溢出 int 的顶部。在这种情况下,您的面具不会设置任何内容。
  • 你能举一个溢出的例子吗?那样会更容易理解
  • 如果字符串中包含'A',它的ASCII值小于'a'怎么办? shift 将是负数并抛出异常。 ASCII 在技术上不包含超过 127 的值,但我假设您正在计算来自 ISO-8859-1 之类的更高代码点。如果它包含“ë”怎么办?移位量约为 38。1
【解决方案2】:

这段代码所做的只是“标记”一点以表示字符的存在。
在您的情况下:int val = str.charAt(i) - 'a';。如果当前字符是a,那么val 等于0,所以checker&amp; (1&lt;&lt;val) 这一行检查是否设置了零位(LSB)。如果是,那么a 之前已经见过。否则它会设置它。如果当前字符是b,那么val 将等于1,因此设置了下一个更高位(第一位),依此类推。
基本上在 ascii 字符集上只使用单个 int 这种方式可以节省空间,而不是 boolean[256] 数组,但此代码只能处理字母表 a-zboolean[256] 处理所有 ASCII,代码会更清晰

【讨论】:

  • 因为您使用的是 32 位原语,而不是 256 布尔值数组,其大小为 not 1 位,正如您所假设的那样。它们捕获1 位信息,但它的实际大小对程序和实现细节是不透明的。我怀疑它是 1 引擎盖下的位。来自docs.oracle.com/javase/tutorial/java/nutsandbolts/…but its "size" isn't something that's precisely defined
  • @Phoenix 因为它只检查小写字母(可以在 32 位中完成(即 26
【解决方案3】:

java 中的布尔值将占用 1 位,因为它只能表示真或假值。例如,如果我有一个布尔值数组。 boolean[] char_set = new boolean[256] 这将占用 256 位对吗?

这是不正确的。现代计算机无法处理单个位。

另外,为了表示 ASCII 字符,你只需要 8 位,因为2^8 = 256(其中^ 表示求幂)。

【讨论】:

    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多