- 1、负数的位运算
计算机中,运算是使用的二进制补码,正数的补码是它本身,负数的补码,符号位不变,其余按位取反,最后再加1
15 :原码——00001111 补码——00001111
-15:原码——10001111 补码——11110001
几个特殊性质:
- 快速判断是否为-1:~x即可,因为-1的补码为11111111,按位取反就变为00000000。
- 去最低位的1:x&(-x)。
2、运算位的一些应用
- 运算位实现乘除:
- 运算位交换两整数:
-
void swap(int &a,int &b) { a^ = b; b^ = a; a^ = b; }
根据交换律:b =b^(a^b)=b^b^a=0^a=a;
- 判断奇偶数:
-
x & 1
- 统计二进制数1的个数
int count(int x)
{
int cnt =0;
while(x)
{
x = x&(x-1)
cnt++;
}
return cnt;
}
3、位运算的例题
- 更新二进制位
-
//题面:给出两个32位的整数N和M,以及两个二进制的位置i,j。写一个方法使得N中的i到j位等于M。 class Solution{ public: int updataBits(int n,int m,int i,int j) { for(int pos =i;pos<=j;pos++) { n &= ~(1<<pos); } return n | (m<<i); } };