如果我使用单个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;
}
有人可以特别解释在这种情况下位向量逻辑的工作原理。他们假设字符串包含小写字符。
答案 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-z
而boolean[256]
处理全部ASCII和代码将更清晰
答案 2 :(得分:0)
java中的布尔值将占用1位,因为它只能表示true或false值。所以例如,如果我有一个布尔值数组。 boolean [] char_set = new boolean [256]这将占用256位正确吗?
这是不正确的。现代计算机无法解决一个问题。
此外,为了表示ASCII字符,您只需要8位2^8 = 256
(其中^
表示取幂)。