位运算和
\([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;
}

浙公网安备 33010602011771号