文章目录
- 位运算是把数字用二进制表示之后,对每一位上0或者1的运算。
- 二进制是指数字的每一位都是0或1.
二进制运算
- 与、或、异或
与(有0则0) | 或 (有1则1) | 异或(不同为1) |
---|---|---|
0&0=0 | 0l0=0 | 0^0=0 |
1&0=0 | 1l0=1 | 1^0=1 |
0&1=0 | 0l1=1 | 0^1=1 |
1&1=1 | 1l1=1 | 1^1=0 |
- 左移、右移
- 左移m<<n表示把m左移n位,左移时,最左边n位被丢弃,同时在最右边 补上n个0
0000 1010<<2 = 0010 1000
1000 1010<<3 = 0101 0000 - 右移m>>n表示把m右移n位,右移时,最右边的n位被丢弃,最左边补什么需要分情况
当数字原先是个正数,右移后左边补n个0(二进制以0开始)
当数字原先是个负数,右移后左边补n个1(二进制以1开始)
0000 1010>>2 = 0000 0010
1000 1010>>3 = 1111 0001
例题: 二进制中1的个数
(1方法)整数二进制最右边一位是不是1,(整数与1做与运算判断是不是0)
在右移继续进行运算 -->会出现死循环
(2方法)不移动输入的数字n 而是通过移动左移1判断每一位是不是1
(3方法)把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变为0
那么一个整数的二进制中有多少个1,则执行多少次操作
int NumberOf1_1(int n)
{
int count = 0;
while (n)
{
if (n & 1) { count++; }
n = n >> 1;
}
return count;
}
int NumberOf1_2(int n)
{
int count = 0;
int flag = 1;
while (flag ) //循环次数等于整数二进制的位数
{
if (n & flag) { count++; }
flag = flag << 1;
}
return count;
}
int NumberOf1_3(int n)
{
int count = 0;
while (n)
{
count++;
n = (n - 1) & n;
}
return count;
}