IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 基础算法之位运算 -> 正文阅读

[数据结构与算法]基础算法之位运算

位运算

一.核心思想:程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。

二.常见的位运算符

C++ 提供了按位与(&)、按位或(| )、按位异或(^)、取反(~)、左移(<<)、右移(>>)这 6 种位运算符。 这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char、short、int 与 long 类型。

1.按位与(&)
用法:a&b(其中a,b为两个整型类型的数值,如果a和b都为1则整个表达式的值为1否则为0)
例如:3&5 怎么来理解呢?
第一步:把3和5转化为各自的二进制表示。3为11,5为101。
第二步:将位数少的补齐多余位。3为11只有两位二进制数,5为101是三位
	   二进制数。我们将11补齐三位为011。
第三步:将其一一对应。
	   3:011
	   5:101
     结果:001
     001的十进制表示为1。故答案为1。

&运算符在算法竞赛中的一些小技巧:
(1)判断是不是偶数:常规写法 if(n % 2 == 0) 可以换为 if(n & 1 == 0)
别的过于鸡肋,就不在这里赘述了。

2.按位或(|)
用法:a|b(其中a,b为两个整型类型的数值,如果a或b只要有一个或同时为1则整个表达式的值为1否则为0)
例如:3|5 怎么来理解呢?
第一步:把3和5转化为各自的二进制表示。3为11,5为101。
第二步:将位数少的补齐多余位。3为11只有两位二进制数,5为101是三位
	   二进制数。我们将11补齐三位为011。
第三步:将其一一对应。
	   3:011
	   5:101
     结果:111
     111的十进制表示为7。故答案为7。

3.按位异或(^)
用法:a^b(其中a,b为两个整型类型的数值,如果a和b相同则为0,不相同为1)
例如:3^5 怎么来理解呢?
第一步:把3和5转化为各自的二进制表示。3为11,5为101。
第二步:将位数少的补齐多余位。3为11只有两位二进制数,5为101是三位
	   二进制数。我们将11补齐三位为011。
第三步:将其一一对应。
	   3:011
	   5:101
     结果:110
     110的十进制表示为6。故答案为6。

异或常用的性质:
1.交换律:a ^ b = b ^ a
2.结合律:(a ^ b) ^ c = a ^ (b ^ c)
异或在算法竞赛中的小技巧
1.任何数异或0都得任何数不变。
2.任何数异或本身都为0。


4.按位取反(~)
用法:~a(其中a为一个整型类型的数值,如果a为0则取反之后为1,若a为1则取反之后为0)
例如:~5 怎么来理解呢?
第一步:把5转化为二进制表示。5为101。
第二步:将其每一位取反。
	    5:101
     结果:010
     010的十进制表示为2。故答案为2。

5.按位左移(<<)
用法:a << x(将a的二进制表示 左移x位)
例如:5 << 2 怎么来理解呢?
第一步:把5转化为对应的二进制表示。5为101。
第二步:将其二进制表示整体左移两位,低位补0。
	   5:101
     结果:10100
     10100的十进制表示为20。故答案为20。
     OMG我们惊奇的发现:左移两位之后,5变成了20。扩大了4倍。
     从中我们总结出来:左移1位就是将原数乘2。左移n位就是将原数
     扩大2的n次方倍。

6.按位右移(>>)
用法:a >> x(将a的二进制表示 右移x位)
例如:5 >> 2 怎么来理解呢?
第一步:把5转化为对应的二进制表示。5为101。
第二步:将其二进制表示整体右移两位,高位补0。
	   5:101
     结果:001
     001的十进制表示为1。故答案为1。
     OMG我们惊奇的发现:右移两位之后,5变成了1。
     从中我们总结出来:右移1位就是将原数除以2。左移n位就是将原数
     缩小2的n次方倍。   

重点:在C++中整数的除法是向0取整。比如5/2=2,-3/2=-1
但是右移的除法是向下取整。比如5/2=2,但是-3/2=-1.5但是由于向下取整答案为-2。

三.位运算中的常见操作

1.求二进制中1的个数

#include<iostreama>
using namespace std;
int n;
int main()
{
	cin >> n;//输入一个数n
	int sum = 0;//记录一下n的二进制表示有多少个1
	while(n)//只要n不等于0就一直执行操作
	{
		if(n & 1) sum++;//将n的最后一位和1相&如果为1说明最后一位是1
		n >> 1;//每判断完一位之后都舍弃最后一位。
	}
	cout << sum;
	return 0;
}

2.实现lowbit运算

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:19:22  更:2022-01-16 13:21:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:45:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码