位运算知识点总结
位运算知识点
按位与(&)
如果x的二进制的第 i 位是1,并且y的二进制第 i 位也是1,那么(x&y)的二进制的第 i 位=1
列如
0101 1010 | |
---|---|
& | 1000 1100 |
0000 1000 |
否则的话(x&y)的二进制的第 i 位=0
按位或(|) 的逻辑和 按位与(&) 基本相同
左移 <<
x 中所有的二进制位向左移动 j 个位置,而右边填入0
所有小于int的类型,移位以 int 的方式来做,结果是 int
x <<= 1等价于x *= 2
x <<= n等价于x *= 2^n
右移 >>
x中所有的位向右移动 j 个位置
所有小于 int 的类型,移位以 int 的方式来做,结果是 int
x >>= 1等价于x /= 2
x >>= n等价于x /= 2^n
———————————————————————————————————————————————————————
使用位运算求出数字的二进制
以前求数字的二进制都要使用数组保存当前位的二进制数字,然后用循环倒叙输出
现在可以用位运算快速求出数字的二进制
#include"bits/stdc++.h"
using namespace std;
int main(){
int number;
while(~scanf("%d",&number)){
unsigned int mask =1<<31;//一定要unsigned。因为int用移位操作会保留左边最高位的数
int flag=0;
for(;mask;mask>>=1){
// 相当于用10000...000
// 01000...000
// 00100...000
// 00010...000逐位与number的二进制数做&运算
if((number&mask?1:0)==1)//判断number的二进制的各个位是0还是1
flag=1;//判断二进制数的第一个1是否已出现
if(flag==1)//如果二进制数的第一个1已出现,输出后面的数
printf("%d",number&mask?1:0);
}
printf("\n");
}
}