12

iOS / Objective-C:ブール値の配列がたくさんあります。

これは、これらの値を格納するための非効率的な方法です。1つだけが必要な場合、各要素に少なくとも8ビットが使用されます。

どうすれば最適化できますか?

4

5 に答える 5

17

CFType オプションについては、CFMutableBitVector/CFBitVector を参照してください。

于 2010-09-19T02:55:37.787 に答える
11

これを試して:

#define BITOP(a,b,op) \
 ((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a)))))

次に、以下の符号なし整数要素の配列の場合size_tBITOPマクロはビット配列として配列にアクセスできます。例えば:

unsigned char array[16] = {0};
BITOP(array, 40, |=); /* sets bit 40 */
BITOP(array, 41, ^=); /* toggles bit 41 */
if (BITOP(array, 42, &)) return 0; /* tests bit 42 */
BITOP(array, 43, &=~); /* clears bit 43 */

于 2010-09-19T16:30:29.600 に答える
6

ビット単位の論理演算とビットシフトを使用します。(これらの用語をGoogleで検索すると、いくつかの例が得られる場合があります。)

基本的に、整数型(、などを含む)を宣言し、int整数char値を必要なビットに「シフト」してから、整数に対してORまたはANDを実行します。

いくつかの簡単な例(C ++):

inline bool bit_is_on(int bit_array, int bit_number)
{
   return ((bit_array) & (1 << bit_number)) ? true : false;
}

inline void set_bit(int &bit_array, int bit_number)
{
   bit_array |= (1 << bit_number);
}

inline void clear_bit(int &bit_array, int bit_number)
{
   bit_array &= ~(1 << bit_number);
}

sizeof(int) * 8これにより、一定サイズ(ビット)の「ビット配列」が提供されることに注意してください。多分それはあなたにとって大丈夫です、あるいは多分あなたはこれの上に何かを作りたいと思うでしょう。(または、ライブラリが提供するものは何でも再利用します。)

これは配列よりも少ないメモリを使用しboolます...しかし...これらのビットにアクセスするためにコンパイラが生成するコードは大きくなり、遅くなります。したがって、これらのビット配列を含める必要のあるオブジェクトが多数ない限り、速度とメモリ使用量の両方に正味の悪影響を与える可能性があります。

于 2010-09-19T02:39:05.857 に答える
2
#define BITOP(a,b,op) \
   ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))

動作しないでしょう ...

修理:

#define BITOP(a,b,op) \
 ((a)[(size_t)(b)/(8*sizeof *(a))] op ((size_t)1<<((size_t)(b)%(8*sizeof *(a)))))
于 2012-11-01T20:16:56.387 に答える
0

Java BitSetに似た大量の「ビット」を管理することを目的としたビット配列フレームワークを書いているときに、この質問に出くわしました。私が決めた名前が他のObjective-Cフレームワークと競合していないかどうかを確認しようとしていました。

とにかく、私はこれを始めたばかりで、SourceForgeまたは他のオープンソースホスティングサイトに投稿するかどうかを決定しています。

興味があれば教えてください

編集:SourceForgeでBitArrayというプロジェクトを作成しました。ソースはSFSVNリポジトリにあり、コンパイルされたフレームワークもアップロードしました。このリンクはあなたをそこに連れて行きます。

  • フランク
于 2011-01-04T11:11:54.500 に答える