class Solution {
public:
    bool validUtf8(vector<int>& data) {
        const int MOD = 256;
        int i = 0, len = data.size();
        while (i < len)
        {
            int byte = data[i] % MOD;
            int k = 0;
            while (k >= 0 && byte >> (7 - k) & 1)++k;
            if (k == 1 || k > 4)return false;
            //unicode max value 0010 FFFF
            //if (k == 4 && byte % 8 > 4)return false;
            while (--k > 0)
            {
                ++i;
                if (i >= len)return false;
                int nextByte = data[i] % MOD;
                if ((nextByte >> 7 & 1) == 0 || nextByte >> 6 & 1)return false;
            }
            ++i;
        }
        return true;
    }
};