首页 > 编程语言 >位运算 学习笔记【C++ 算法竞赛】

位运算 学习笔记【C++ 算法竞赛】

时间:2023-08-14 14:35:32浏览次数:65  
标签:tmp 运算 二进制 笔记 int 算法 C++ 应用 --

大家好,欢迎来到我的第一篇博客

位运算和移位运算作为计算机的基本运算之⼀,其都是对⼆进制位进⾏操作。作为近年算法竞赛笔试较热门的考点,它能够快捷地完成特定的应用。掌握它是⾮常有必要的。

以下是目录:

目录

1. 位运算的优先级

C++运算符的具体优先级详见大佬的文章

我们学习位运算时需要牢记的优先级简单说来是(从大到小,从先到后):

  1. ~、!
  2. ***、/ **
  3. +、-
  4. <<、>>
  5. ==、!=
  6. &
  7. |
  8. &&
  9. ||

2. 左移运算 <<、右移运算>>

2.1 运算规则:

在二进制中表现为将数字整体向左或向右移动n位

1 << 2 == 4         (1)
2 >> 1 == 4         (2)
//二进制的操作表现为
0001 --> 0010       (1)
0010 --> 0001       (2)
//少的位数用0来补,多的位数就吞掉了

在数学上,又有不同的意义

1 << 1 == 2  1*2   == 2 //乘二
1 << 2 == 4  1*2*2 == 4 //乘二的次方
    
4 >> 1 == 2  4/2 == 2   //整除二
7 >> 2 == 1  7/2/2 == 1 //整除二的次方
   
//效率比普通运算要高

2.2 应用:快速获取2的次方

观察上文左移运算的数学意义,不难发现

1 >> k ==> 2^k

3. 与运算 &

3.1 运算规则:

1 & 1 == 1
1 & 0 == 0
0 & 0 == 0
    
// 只有两位都是1才得1
// 只要有0就得0 

// 特殊运算律
a & b == b & a
a & 0 == 0
a & a == a
a & (b & c) == (a & b) & c
a & ~a == 0

3.2 应用1:判断2的次方

运行以下代码

int tmp;
while(cin >> tmp){
    cout << (tmp &= tmp -1) << ' ';
}

输入:

1 2 3 4 5 6 7 8 9

输出:

0 0 2 0 4 4 6 0 8 

通过观察我们发现:

2^k & 2^k-1 == 0
    
// 原理如下:
    010000...
  & 001111...
 --------------
    000000...

3.3 应用2:统计数字二进制形式中有多少个 1

运行以下代码

int tmp; 
while(cin >> tmp){
    int ans = 0;
    while(tmp){
        tmp &= tmp-1;
        ans ++;
    }
    cout << ans << ' ';
}

输入:

1 2 3 4 5 6 7 8 9

输出:

1 1 2 1 2 2 3 1 2

通过观察我们发现:

1的二进制:0001  -->  1个1
2的二进制:0010  -->  1个1
3的二进制:0011  -->  2个1
4的二进制:0100  -->  1个1
    ......

所以:

通过 n &= n-1 并在n!=0时进行计数,可以统计n二进制中1的个数

4. 或运算 |

4.1 运算规则

1 | 1 == 1
1 | 0 == 1
0 | 0 == 0
    
// 只有两位都是零才得0
// 只要有1就得1

// 特殊运算律
a | b == b | a
a | a == a
a | 0 == a
a | ~a == -1

5. 异或运算 ^

5.1 运算规则:

0 ^ 0 == 0	
1 ^ 1 == 0	
1 ^ 0 == 1   

//相同为0,不同为1
    
// 特殊运算律
a ^ 0 == a
a ^ a == 0
a ^ b == b ^ a

5.2 应用:交换两数(swap)

运行以下代码:

void Swap(int &a, int &b){
	a ^= b;
	b ^= a;
	a ^= b;
}
int main(){
	int n, m; cin >> n >> m;
	Swap(n, m);
	cout << n << ' ' << m;
	
	return 0;
}

输入:

1 2

输出:

2 1

此应用的原理如下:

a = a ^ b
b = b ^ a = b ^ (a ^ b) 
    	  = b ^ b ^ a
    	  = 0 ^ a
    	  = a
a = a ^ b = (a ^ b) ^ a 
    	  = a ^ a ^ b
    	  = 0 ^ b
    	  = b
   

结束啦

这篇文章原本是我的课堂笔记,只是略微补充了一下,内容可能会有错误或不完整的地方,欢迎大家指正

标签:tmp,运算,二进制,笔记,int,算法,C++,应用,--
From: https://www.cnblogs.com/jdashuai-wagc/p/17628554.html

相关文章

  • 路径规划算法:基于人工蜂鸟优化的机器人路径规划算法- 附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 路径规划算法:基于协作搜索优化的机器人路径规划算法- 附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • (笔记)Ethercat解析之命令行工具的使用教程
     说明:EtherCAT为了方便用户空间对主站进行调试,因此提供一套用户空间使用的工具来设置从站参数,观察调试信息等等。正常情况下,每个主站的实例都会生成一个字符设备,名字为:/dev/EtherCATx。欲想深入了解其他命令,可通过执行ethercat–help命令来查看详细使用方法。 一、ethercat......
  • 【笔记】YOLO v3:An Incremental Improvement
     第一部分:论文与代码论 文:https://pjreddie.com/media/files/papers/YOLOv3.pdf翻 译:https://zhuanlan.zhihu.com/p/34945787代 码:https://github.com/pjreddie/darknet官 网:https://pjreddie.com/darknet/yolo旧 版: https://pjreddie.com/darknet/yolov2/ https://p......
  • 《Java编程思想第四版》学习笔记12
    对于一个复杂的对象,构建器的调用遵照下面的顺序:(1)调用基础类构建器。这个步骤会不断重复下去,首先得到构建的是分级结构的根部,然后是下一个衍生类,等等。直到抵达最深一层的衍生类。(2)按声明顺序调用成员初始化模块。(3)调用衍生构建器的主体。          ......
  • Spring 响应式编程-读书笔记
    本文为《Spring响应式编程》的读书笔记,响应式技术栈可以创建极其高效、易于获取且具有回弹性的端点,同时响应式可以容忍网络延迟,并以影响较小的方式处理故障。响应式微服务还可以隔离慢速事务并加速速度最快的事务。通过本书可以学到以下内容:响应式编程基本原则和响应式流(Reactive......
  • 【刷题笔记】21. Merge Two Sorted Lists
    题目Mergetwosortedlinkedlistsandreturnitasanewlist.Thenewlistshouldbemadebysplicingtogetherthenodesofthefirsttwolists.Example:Input:1->2->4,1->3->4Output:1->1->2->3->4->4题目大意合并2个有序链表解题思路按照......
  • Go/C++/Java中的数组对比
    数组是大多数编程语言中的基本数据结构。然而,不同的编程语言对数组的实现和语义有所不同。以下是Go、C++和Java中数组的主要区别:1.基本性质Go:数组是值类型。赋值或将数组传递给函数时,内容会被复制。数组的大小是其类型的一部分。因此,具有不同大小的数组被认为是不同......
  • C++系列一:语言基础-杂烩2
    @目录前言:信号处理前言:继续……信号处理信号是由操作系统传给进程的中断,会提早终止一个程序。头文件中。SIGABRT 程序的异常终止,如调用abort。SIGFPE 错误的算术运算,比如除以零或导致溢出的操作。SIGILL 检测非法指令。SIGINT 程序终止(interrupt)信号。SIGSEGV 非......
  • 优化:深度神经网络Tricks【笔记】
    Slide:http://lamda.nju.edu.cn/weixs/slide/CNNTricks_slide.pdf博文:http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html 1)dataaugmentation;    2)pre-processingonimages;     3)initializationsofNetworks;      4)sometips......