0

ASCII文字セットを表すために単一のintを使用する場合、それをどのように使用すると、ストレージスペースが8分の1に削減されますか?256ブール値の配列と比較して?単一のintもビットベクトルのように機能しています。

javaのブール値は、trueまたはfalseの値しか表せないため、1ビットを占有します。たとえば、ブール値の配列がある場合。boolean [] char_set = new boolean [256]これは256ビットを占有しますか?私が読んでいるのは、ビットベクトルのような単一のintを使用する場合、つまり32ビットを使用して256の値をカバーできるということです。それは8分の1の削減だと思います。しかし、なぜ以下のコードが機能するのでしょうか。

文字列に重複があるかどうかをチェックしています。彼らはアスキー文字セットを想定しています。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;
}

この場合、ビットベクトルロジックがどのように機能するかを誰かが特に説明できますか?文字列に小文字が含まれていることを前提としています。

4

3 に答える 3

2

Anintは256ビットではなく32ビットです。256の可能なアイテムのセットを表すには、それだけでは十分ではありません。あなたはそれらのうちの8つが必要です。その場合、32ビットしか使用できないという意味がわかりません。

何をループしているのかが明確ではありません-何strですか?0から255までのすべての256の値?あなたが減算しているので、私は疑わしいです'a'。あなたの価値観の世界はたった32文字しかありませんか?次に、32ビットを使用できることを確認します。しかし、256はそれからどこから来たのでしょうか?

マスク条件は!= 0、最上位のビットセットで機能する必要があります。

(Abooleanの「実際の」サイズはJavaプログラマーには不透明です。実際には、1ビット(マシンはビットアドレス指定可能ではありません)でも1バイトでもありません。Javaは実際には32ビット全体を使用します。単語。しかし、これは実際にはあなたの質問とは関係ありません。)

于 2012-09-15T19:14:07.090 に答える
1

コードの一部が行うことは、文字の存在を示すためにビットを「マーク」することです。
あなたの場合:int val = str.charAt(i) - 'a';。現在の文字が等しいa場合、この行はゼロビットが設定されているかどうかをチェックします(LSB)。それが以前に見られた場合。それ以外の場合は設定します。現在の文字がに​​等しい場合、次に高いビットが設定されます(最初のビット)。 基本的に、この方法で単一を使用するascii文字セットでは、配列とは対照的にスペースを節約できますが、このコードはアルファベットのみを処理でき、ASCIIはすべて処理するため、コードはより明確になります。val0checker& (1<<val)abval1
intboolean[256]a-zboolean[256]

于 2012-09-15T19:20:19.937 に答える
0

javaのブール値は、trueまたはfalseの値しか表せないため、1ビットを占有します。たとえば、ブール値の配列がある場合。boolean [] char_set = new boolean [256]これは256ビットを占有しますか?

これは正しくありません。Mondernコンピュータは、1ビットをアドレス指定できません。

また、ASCII文字を表すには、8ビットしか必要ありません2^8 = 256(ここで、^はべき乗を意味します)。

于 2012-09-15T19:24:04.060 に答える