質問: 1;// } }; #endif ```
回答: あなたが何がわかっていないのか読者的にわからないので、どこから説明すればよいのか微妙なところがありますが まず前提として `bool` 値というのは `false` / `true` の2種類しかないので `bool` 1つを 1bit つまり2進数の1桁で表現できるということはわかりますか?提示ソースコードは `false` を2進数1桁の `0` で `true` を2進数1桁の `1` で表記しようとしています。 このコードは大きな個数の `bool` をひとまとめに扱おうとしています。 `123` 個とか `34567` 個の `bool` を、それぞれに 1bit を割り振って最小限の記憶域容量で扱おうとしています。 [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") には1ビット単位でメモリを確保する機能は用意されていないので `new BYTE[]` で複数の `BYTE` を確保することで代用しています。この際に、切り上げないと数が足らないのはわかりますよね。 話を簡単にするため `CHAR_BITS` が 8 ということにします。すると `char` というか `BYTE` 1つに 8bit が格納できるということになります。 A1. * `i/CHAR_BITS` は当該 `i` ビットが何バイト目か * `i & (CHAR_BITS - 1)` はそのバイト内での何ビット目か ということになります。 ``` |x|x|x|x|x|x|x|x| (1バイトに8個の2進数が格納できる、その BYTE の [0] 番目) | | | | | | | +-- [0] は0バイト目のビット0 | | | | | | +---- [1] は0バイト目のビット1 | | | | | +------ [2] は0バイト目のビット2 +---------------- [7] は0バイト目のビット7 |x|x|x|x|x|x|x|x|(同様 BYTE の [1] 番目) | | | | | | | +-- [8] は1バイト目のビット0 | | | | | | +---- [9] は1バイト目のビット1 +---------------- [15] は1バイト目のビット7 ``` `x&(8-1)` は `x%8` と同値、つまり8で割ったときの剰余を求めています。いかにも2進数ぽいロジックなわけですが、これが理解できないと話は難しいです。 `x/8` で求めた商は何バイト目か、剰余は何ビット目か、ですね。 `x%8` とソースコード上書くとコンパイラが除算命令を生成するかもしれません(遅い)。この例ではビット演算命令で済む(高速)ので、提示ソースのように書いておけばコンパイラは除算命令を生成しないことが期待できます。 上記の話は `CHAR_BITS` が2の冪でないと成り立ちません。例えば `x%7` を `x&(7-1)` とすることはできないわけです。でもまあ現代コンピュータでは `CHAR_BITS` `は2の冪であることを期待して問題ないでしょう(そうでないものを見たことがない)。 A2. 例外を発生させると、どこで例外が発生したかはデバッガでわかります。が、その行に複数個の `Array` が出現していると、どっちで例外が発生したかぱっと見わかりません。例外オブジェクトの中に `this` が入っていればデバッグが楽になります。 A3. どこのことでしょうか?コメントは入っていますが「コメントアウトされたコード」は見つけられませんでした。 `idx` は「何ビット目」か、式 `1<