位运算和

\([1,n]\)异或和

int xor_n(int n) //从1到n的异或和
{
    int t = n & 3;
    if (t & 1)
        return t / 2 ^ 1;
    return t / 2 ^ n;
}

\([n,m]\)按位或和
从高位开始,对于第一个不同的位置\(i\)\(n\)的第\(i\)位一定为\(0\)\(m\)一定为\(1\),所以\(i\)之前都是和\(n\)\(m\)一致,\(i\)及之后都为\(1\)

int or_sum(int n,int m)
{
    int tmp=n-m;
    int cnt=1;
    while(tmp)
    {
        tmp/=2;
        cnt<<=1;
    }
    n|=m;
    n|=(cnt-1);
    return n;
}

\([n,m]\)按位与和

int ans_sum(int n,int m){
    int l = n, r = m;
	while(l < r) r = r & (r - 1);
	return r & l;
}
posted @ 2020-07-05 16:43  Zeronera  阅读(140)  评论(0)    收藏  举报