Solidityメモ: ビット演算
例えば256個のフラグを管理したいとき、256個のboolを用意するのではなく、 ビット演算を使えば1つのuint256で256個のフラグを管理できるじゃないかと思ったので、方法を調べてみました。
ガスも節約できるはず!?
参考: ビット演算 (bit 演算) の使い方を総特集! 〜 マスクビットから bit DP まで 〜 - Qiita
A. boolを使う方法
// bool x 256 contract TestFlags1 { bool[256] flags; function setFlag(uint256 index, bool value) public { flags[index] = value; } function getFlag(uint256 index) public view returns (bool){ return flags[index]; } }
B. ビット演算を使う方法
// uint256 x 1 contract TestFlags2 { uint256 flags; function setFlag(uint256 index, bool value) public { if (value) flags |= 1 << index; else flags &= ~(1 << index); } function getFlag(uint256 index) public view returns (bool){ return flags & (1 << index) != 0; } }
ガスの比較
TODO: どれくらい変わるのか調べる。