社区讨论

给孩子们一个手写的bitset快多了

P11831[省选联考 2025] 追忆参与者 5已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@miykrqok
此快照首次捕获于
2025/12/09 20:47
2 个月前
此快照最后确认于
2025/12/12 18:40
2 个月前
查看原帖
CPP
struct bitst {
    static constexpr int SZ = SIZ;
    alignas(32) u64 a[SZ];

    void reset() {
        memset(a, 0, sizeof(a));
    }
    void set(int x) {
        a[x >> 6] |= 1ull << (x & 63);
    }
    void flip(int x) {
        a[x >> 6] ^= 1ull << (x & 63);
    }
    int val(int x) {
        return (a[x >> 6] >> (x & 63)) & 1;
    }

    void operator|=(const bitst &b) {
        for (int i=0;i<SZ;i+=4) {
            __m256i x = _mm256_load_si256((__m256i*)(a+i));
            __m256i y = _mm256_load_si256((__m256i*)(b.a+i));
            __m256i z = _mm256_or_si256(x,y);
            _mm256_store_si256((__m256i*)(a+i),z);
        }
    }

    void operator^=(const bitst &b) {
        for (int i=0;i<SZ;i+=4) {
            __m256i x = _mm256_load_si256((__m256i*)(a+i));
            __m256i y = _mm256_load_si256((__m256i*)(b.a+i));
            __m256i z = _mm256_xor_si256(x,y);
            _mm256_store_si256((__m256i*)(a+i),z);
        }
    }

    void operator&=(const bitst &b) {
        for (int i=0;i<SZ;i+=4) {
            __m256i x = _mm256_load_si256((__m256i*)(a+i));
            __m256i y = _mm256_load_si256((__m256i*)(b.a+i));
            __m256i z = _mm256_and_si256(x,y);
            _mm256_store_si256((__m256i*)(a+i),z);
        }
    }
};
这是 gpt 写的,实测快多了。

回复

7 条回复,欢迎继续交流。

正在加载回复...