常见位运算总结

发布时间:2024年01月04日

?个人主页:Lei宝啊?

愿所有美好如期而遇?


?

目录

前言

1.基础位运算

&运算

|运算

^运算

>>运算

<<运算

~运算

2.给一个数n,确定他的二进制表示中的第x位,是0还是1

3.将一个数n的二进制表示的第x位修改成1

4.将一个数n的二进制表示的第x位修改成0

5.位图的思想

6.提取一个数n二进制表示中最右侧的1

7.干掉一个数n二进制表示中最右侧的1

8.位运算的优先级

9.异或运算的运算律


前言

在开始本篇文章时,建议了解?原码,反码,补码以及计算

1.基础位运算

&运算

按照补码进行按位与

  • 0 & 0 = 0??
  • 0 & 1 = 0
  • 1 & 1 = 1?
|运算

按照补码进行按位或

  • 0 | 0 = 0
  • 1 | 0 = 1
  • 1 | 1 = 1
^运算
  • 按位异或,相同为0,不同为1
  • 不进位相加

?按照补码进行按位异或

  • 0 ^ 0 = 0
  • 0 ^ 1 = 1
  • 1 ^ 1 = 0?
>>运算

每向右移动一位,相当于除以2?

<<运算

每向左移动一位,相当于乘以2??

~运算

每个比特位按位取反。

2.给一个数n,确定他的二进制表示中的第x位,是0还是1

#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;
}

3.将一个数n的二进制表示的第x位修改成1

#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;
}

?

4.将一个数n的二进制表示的第x位修改成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;
}

?

5.位图的思想

用一个变量的某个比特位表示某种状态,0表示假,1表示真,我们看图:

在进程的切换与调度中,底层就使用位图去标识运行队列是否为空,还有一个就是Linux下文件类系统调用中,有一个open系统调用,他的第二个参数flags,都是利用了位图。

6.提取一个数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;

	n &= -n;
	cout << n;

	return 0;
}

?

-n:n二进制表示中,最右边1的左边二进制数全部取反。

7.干掉一个数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及其右边全部取反

8.位运算的优先级

这里推荐,如果使用位运算,不确定优先级,那么就加括号。

9.异或运算的运算律

  • a ^ 0 = a
  • a ^ a = 0
  • a ^ b ^ c = a ^ (b ^ c)

文章来源:https://blog.csdn.net/m0_74824254/article/details/135387792
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。