常见位运算:
符号 | 描述 | 运算规则 |
& | 与 | 0&0=0;0&1=0;1&0=0;1&1=1 |
| | 或 | 0|0=0;0|1=1;1|0=1;1|1=1 |
~ | 取反 | ~1=0;~0=1 |
^ | 异或 | 0^0=0;0^1=1;1^0=1;1^1=0 |
<< | 左移 | 二进制数各位左移,高位丢弃,低位补0 |
>> | 右移 | 二进制数各位右移,低位丢弃,正数左补0,负数左补1 |
举例:
假设字节长度为8位
x = 12
原 码 x :0 0 0 0 1 1 0 0(二进制表示 第一位为符号位 正为0 负为1)
反 码 ~ x :0 1 1 1 0 0 1 1(第一位为符号位 所以不取反)
补码 ~ x + 1:0 1 1 1 0 1 1 1(反码的末位加1 有进位则进位)
例题:801. 二进制中1的个数 - AcWing题库
#include <iostream>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
while (n -- )
{
int x, s = 0;
scanf("%d", &x);
for (int i = x; i != 0; i -= i & -i) s ++ ;//i&-i:返回i的最后一位1
printf("%d ", s);
}
return 0;
}
其他常见题型:
问n的二进制表示中第k位是多少
做法:
- 先把第k位移到最后一位:n>>k(将n右移k位)
- 看右移后此时各位是多少:n&1(n为一个整数,该操作可返回n的二进制数最后一位0或1)
输出二进制数:for(int k = 3;k >= 0;k --)cout << (n >> k & 1);
题目中知识点小结:
- 看一个数x的二进制数的个位是多少:x & 1
- 一个整数的负数是元素的补码:- x = ~ x + 1