Now and Nawoo

NFTの制作記録、技術メモ → C#, Solidity, Blockchain, Bitcoin, Ethereum, NFT

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: どれくらい変わるのか調べる。