位运算笔记

判断奇偶(逻辑与 &)

1
2
3
4
5
6
if((x&1) == 1)
printf("x是奇数\n");

else if((x&1) == 0)
printf("x是偶数\n");

交换两个整数(逻辑异或 ^)

1
2
3
4
5
6
7
void sswap(int *a,int *b)
{
*a = *a ^ *b;
*b = *b ^ *a;
*a = *a ^ *b;
}

求整数的绝对值

1
2
3
4
5
6
7
int ffabs(int x)
{
if(x>0)
return x;
else
return ~x + 1;
}

获取二进制数的某一位

1
x>>i&1;//表示x的二进制第i位

修改二进制中的某一位为1

1
x|(1<<i);

修改二进制中的某一位为0

1
x&~(1<<i);

快速判断一个数字是否为2的幂次方

1
x&(x-1);//是则为0

获取二进制位中最低位的1

1
lowbit(x)=x&-x;//若x=010010则lowbit(x)=000010