基础算法|位运算
1.与运算
2.或运算
3.非运算
4.异或运算
5.左移、右移运算
心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。
与运算
与运算(&):全
1
才为1
实践代码:
void solve(){
/*
* 7 -> 0111
* 8 -> 1000
* 7&8 -> 0000
* */
cout<<(7&8)<<endl;
}
输出
或运算
或运算(|):有
1
就为1
实践代码:
void solve(){
/*
* 7 -> 0111
* 8 -> 1000
* 7|8 -> 1111
* */
cout<<(7|8)<<endl;
}
输出
非运算
非(~):按位
取反
,符合位也取反
实践代码:
void solve(){
/*
* 7 -> 0111
* ~7 -> 1000
* */
cout<<(~7)<<endl;
}
输出
异或运算
异或(^):同
0
异1
实践代码:
void solve(){
/*
* 7 -> 0111
* 10 -> 1010
* 7^10-> 1101
* */
cout<<(7^10)<<endl;
}
输出
左移、右移运算
左移、右移(<</>>):
左移k位:相当于这个数 * 2k
右移k位:相当于这个数 / 2k
实践代码:
void solve(){
/*
* 1 -> 00001
* 1<<4 -> 10000
* 16>>4-> 00001*/
cout<<(1<<4)<<endl;
cout<<(16>>4)<<endl;
}
输出
补充:
如果想要判断二进制数中某一位上是1还是0,可以>>和&结合,如a=10000001(二进制数),现在我们要求它第3位上是什么,那么我们就可以用 a>>3&1来实现
模板:
求n的第k位数字:n>>k&1
返回n的最后一位1:lowbit(n) = n & -n
心有猛虎,细嗅蔷薇。再见了朋友~