Java中的ascii char表示?

时间:2012-09-15 18:54:37

标签: java

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

java中的布尔值将占用1位,因为它只能表示true或false值。所以例如,如果我有一个布尔值数组。 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;
}

有人可以特别解释在这种情况下位向量逻辑的工作原理。他们假设字符串包含小写字符。

3 个答案:

答案 0 :(得分:2)

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

目前还不清楚你在循环什么 - str是什么?所有256个值从0到255?我很怀疑,因为你正在减去'a'。您的价值观范围只有32个可能的字符吗?然后确定你可以使用32位。但是从那时起256来自哪里?

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  

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

这是不正确的。现代计算机无法解决一个问题。

此外,为了表示ASCII字符,您只需要8位2^8 = 256(其中^表示取幂)。