zhangas

Pay more attention

0%

位运算

位运算概览

1
2
3
4
5
6
7
符号 描述	 运算规则
& 与 两个位都为1时,结果才为1
| 或 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 取反 0110
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

求n的二进制第k位是多少

1
cout<<(n>>k&1);

这里&1判断n是否为奇数
①n为奇数时,对应的二进制数最低位一定为1,&1的结果就是1.
②n为偶数时,相应的最低位为0,n&1的结果就是0.
这里等价于 (n>>k)%2

统计n的二进制中有多少个1

x&-x
(-x)=~x+1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
假设x==42
原码 x (101010)
反码 ~x (010101)
补码 ~x+1(010110)
x&-x (000010)
*/
int lowbit(int x){
return x&-x;
}
int cnt=0;
while(a){
a-=lowbit(a);//减去最右侧第一个1到末尾的部分
cnt++;
}
cout<<cnt;