?个人主页:Lei宝啊?
愿所有美好如期而遇?
?
目录
在开始本篇文章时,建议了解?原码,反码,补码以及计算
按照补码进行按位与
按照补码进行按位或
?按照补码进行按位异或
每向右移动一位,相当于除以2?
每向左移动一位,相当于乘以2??
每个比特位按位取反。
#include <iostream>
using namespace std;
//给一个数n,确定他的二进制表示中的第x位,是0还是1
int main()
{
int n, x;
//cin >> n >> x;
//000101000000111011011000
n = 1314520;
x = 6;
cout << (1 & (n >> (x - 1))) << endl;
return 0;
}
#include <iostream>
using namespace std;
//将一个数n的二进制表示的第x位修改成1
int main()
{
int n, x;
//cin >> n >> x;
//000101000000111011011000
n = 1314520;
x = 6;
n |= 1 << (x - 1);
cout << n;
return 0;
}
?
#include <iostream>
using namespace std;
//将一个数n的二进制表示的第x位修改成0
int main()
{
int n, x;
//cin >> n >> x;
//000101000000111011011000
n = 1314520;
x = 7;
n &= ~(1 << (x - 1));
cout << n;
return 0;
}
?
用一个变量的某个比特位表示某种状态,0表示假,1表示真,我们看图:
在进程的切换与调度中,底层就使用位图去标识运行队列是否为空,还有一个就是Linux下文件类系统调用中,有一个open系统调用,他的第二个参数flags,都是利用了位图。
#include <iostream>
using namespace std;
//提取一个数n二进制表示中最右侧的1
int main()
{
int n, x;
//cin >> n >> x;
//000101000000111011011000 n
//111010111111000100101000 -n
n = 1314520;
x = 7;
n &= -n;
cout << n;
return 0;
}
?
-n:n二进制表示中,最右边1的左边二进制数全部取反。
#include <iostream>
using namespace std;
//干掉一个数n二进制表示中最右侧的1
int main()
{
int n, x;
//cin >> n >> x;
//000101000000111011011000 n
//111010111111000100101000 -n
n = 1314520;
x = 7;
//000000000000000000001000 n & -n
n ^= n & -n;
cout << n;
return 0;
}
?
#include <iostream>
using namespace std;
//干掉一个数n二进制表示中最右侧的1
int main()
{
int n, x;
//cin >> n >> x;
//000101000000111011011000 n
n = 1314520;
x = 7;
n &= n - 1;
cout << n;
return 0;
}
?n-1 :最右边的1及其右边全部取反
这里推荐,如果使用位运算,不确定优先级,那么就加括号。