c++学习笔记(9)

1.

在 C++ 中,表达式 (i & 1) 是一个位运算表达式。它使用了按位与操作符 & 来对变量 i 和数字 1 进行二进制的按位与操作。

按位与操作符 & 会比较两个数的二进制表示中的对应位,如果两个相应的二进制位都为 1,则该位的结果值为 1,否则为 0。

由于数字 1 的二进制表示只在最低位(也就是最右边的位)为 1,其他位都是 0,所以 (i & 1) 这个表达式的结果就是检查变量 i 的最低位是否为 1:

  • 如果 i 的最低位是 1,那么 (i & 1) 的结果就是 1。

  • 如果 i 的最低位是 0,那么 (i & 1) 的结果就是 0。

因此,(i & 1) 可以用来判断 i 是否是奇数。如果结果是 1,那么 i 是奇数;如果结果是 0,那么 i 是偶数。

 

2.

快速幂是一种高效的算法,用于计算一个数的指数次幂。在 C++ 中,可以使用递归或迭代的方式来实现快速幂。

迭代代码示例:

#include <iostream>
using namespace std;long long quickPow(long long base, long long exponent) {long long result = 1;while (exponent > 0) {if (exponent & 1) { // 如果指数是奇数,则将当前底数乘入结果中result *= base;}base *= base; // 底数平方exponent >>= 1; // 指数右移一位(相当于除以2)}return result;
}int main() {long long base, exponent;cout << "请输入底数和指数:" << endl;cin >> base >> exponent;cout << base << " 的 " << exponent << " 次幂为:" << quickPow(base, exponent) << endl;return 0;
}

 

3.

在 C++ 中,位移运算符包括左移运算符 << 和右移运算符 >>。

  1. 左移运算符 <<

左移运算符 << 用于将一个数的二进制表示向左移动指定的位数。具体来说,x << n 的操作是将 x 的二进制表示向左移动 n 位,同时将最右边的 n 位移出,并在最左边补上 n 个 0。

例如,假设有一个整数 x,其二进制表示为 101(十进制中的 5),那么 x << 1 的结果就是 1010(十进制中的 10)。

需要注意的是,当使用左移运算符时,需要注意数值类型的范围和溢出的问题。对于有符号整数类型,左移操作会保留符号位,即正数的符号位为 0,负数的符号位为 1。而对于无符号整数类型,左移操作不会保留符号位,而是直接在最左边补上 0。

  1. 右移运算符 >>

右移运算符 >> 用于将一个数的二进制表示向右移动指定的位数。具体来说,x >> n 的操作是将 x 的二进制表示向右移动 n 位,同时将最左边的 n 位移出,并在最右边补上 n 个 0。

例如,假设有一个整数 x,其二进制表示为 1010(十进制中的 10),那么 x >> 1 的结果就是 0101(十进制中的 5)。

需要注意的是,当使用右移运算符时,需要注意数值类型的范围和符号位的处理。对于有符号整数类型,右移操作会保留符号位,即正数的符号位为 0,负数的符号位为 1。而对于无符号整数类型,右移操作不会保留符号位,而是直接在最左边补上 0。

另外,左移操作相当于将原数乘以2的n次方,其中 n 是左移的位数。因此,可以使用左移运算符来高效地进行乘法运算。但需要注意的是,如果左移的位数过大,可能会导致溢出或者超出数值类型的范围,从而得到错误的结果。

代码示例:

#include <iostream>
using namespace std;int main() {int x = 5; // 二进制表示为 101cout << "x << 1: " << (x << 1) << endl; // 输出 10,即 1010cout << "x >> 1: " << (x >> 1) << endl; // 输出 2,即 10return 0;
}

 

4.

在 C++ 中,按位运算符包括以下几种:

  1. 按位与运算符 &

按位与运算符 & 用于对两个数的二进制表示进行按位与操作。具体来说,对于两个二进制数 a 和 b,它们的按位与操作的结果是将它们每一位上的值进行逻辑与操作,即如果两个数在该位上都是 1,则结果为 1,否则为 0。

例如,假设有两个整数 x 和 y,它们的二进制表示分别为 1010 和 1100,那么 x & y 的结果就是 1000(十进制中的 8)。

需要注意的是,按位与操作只能用于整数类型,不能用于浮点数类型。此外,按位与操作的结果也是一个整数,因此需要注意数值类型的范围和溢出的问题。

  1. 按位或运算符 |

按位或运算符 | 用于对两个数的二进制表示进行按位或操作。具体来说,对于两个二进制数 a 和 b,它们的按位或操作的结果是将它们每一位上的值进行逻辑或操作,即如果两个数在该位上至少有一个为 1,则结果为 1,否则为 0。

例如,假设有两个整数 x 和 y,它们的二进制表示分别为 1010 和 1100,那么 x | y 的结果就是 1110(十进制中的 14)。

需要注意的是,按位或操作只能用于整数类型,不能用于浮点数类型。此外,按位或操作的结果也是一个整数,因此需要注意数值类型的范围和溢出的问题。

  1. 按位异或运算符 ^

按位异或运算符 ^ 用于对两个数的二进制表示进行按位异或操作。具体来说,对于两个二进制数 a 和 b,它们的按位异或操作的结果是将它们每一位上的值进行逻辑异或操作,即如果两个数在该位上相同,则结果为 0,否则为 1。

例如,假设有两个整数 x 和 y,它们的二进制表示分别为 1010 和 1100,那么 x ^ y 的结果就是 0110(十进制中的 6)。

需要注意的是,按位异或操作只能用于整数类型,不能用于浮点数类型。此外,按位异或操作的结果也是一个整数,因此需要注意数值类型的范围和溢出的问题。

  1. 按位取反运算符 ~

按位取反运算符 ~ 用于对一个数的二进制表示进行按位取反操作。具体来说,对于一个二进制数 a,它的按位取反操作的结果是将其每一位上的值进行逻辑非操作,即如果该位上的值为 1,则结果为 0,否则为 1。

例如,假设有一个整数 x,其二进制表示为 1010,那么 ~x 的结果就是 0101(十进制中的 -11)。

需要注意的是,按位取反操作只能用于整数类型,不能用于浮点数类型。此外,按位取反操作的结果也是一个整数,因此需要注意数值类型的范围和溢出的问题。

代码示例:

#include <iostream>
using namespace std;int main() {int x = 5, y = 3; // 二进制表示分别为 101 和 011cout << "x & y: " << (x & y) << endl; // 输出 1,即 001cout << "x | y: " << (x | y) << endl; // 输出 7,即 111cout << "x ^ y: " << (x ^ y) << endl; // 输出 6,即 110cout << "~x: " << (~x) << endl; // 输出 -6,即 1010(补码表示)return 0;
}

 

5.

倍增思想是一种优化算法,用于解决某些问题的时间复杂度。它的基本思想是将问题分解为多个子问题,然后通过合并子问题的解来得到原问题的解。在计算机科学中,倍增思想常用于解决区间查询问题,如求区间最小值、最大值、区间和等。

下面以求解区间最小值为例,介绍倍增思想的实现过程:

  1. 首先,我们需要预处理出每个节点的父节点和深度信息。假设我们有一个数组a,长度为n,我们可以使用一个二维数组pre[i][j]来存储a[i]到a[j]之间的最小值。其中,pre[i][j]的值可以通过比较a[i]和a[j]的值来确定。

  2. 然后,我们需要计算出每个节点的深度信息。对于每个节点i,我们可以计算出它的深度d[i],即从根节点到该节点的路径上经过的节点数。具体地,我们可以使用一个一维数组depth来存储每个节点的深度信息,初始时depth[0]=0,depth[i]=depth[parent[i]]+1。

  3. 最后,我们可以使用倍增思想来求解任意区间[l,r]的最小值。具体地,我们可以先找到l和r的最近公共祖先p,然后分别计算出a[l]到a[p]和a[p]到a[r]的最小值,最后将这两个最小值进行比较,即可得到a[l]到a[r]的最小值。

下面是代码示例:

#include <iostream>
#include <vector>
using namespace std;const int N = 1e5 + 10;
int n, m;
int a[N];
int pre[N][20], depth[N];void init() {for (int i = 1; i <= n; i++) {pre[i][0] = i;}for (int j = 1; j < 20; j++) {for (int i = 1; i + (1 << j) - 1 <= n; i++) {if (a[pre[i][j - 1]] < a[pre[i + (1 << (j - 1))][j - 1]]) {pre[i][j] = pre[i][j - 1];} else {pre[i][j] = pre[i + (1 << (j - 1))][j - 1];}}}for (int i = 2; i <= n; i++) {depth[i] = depth[pre[i][0]] + 1;}
}int lca(int u, int v) {if (depth[u] > depth[v]) {swap(u, v);}for (int i = 19; i >= 0; i--) {if (depth[v] - depth[u] >= (1 << i)) {v = pre[v][i];}}if (u == v) {return u;}for (int i = 19; i >= 0; i--) {if (pre[u][i] != pre[v][i]) {u = pre[u][i];v = pre[v][i];}}return pre[u][0];
}int query(int l, int r) {int p = lca(l, r);int ans = min(a[l], a[r]);if (l != p) {ans = min(ans, a[p]);}if (r != p) {ans = min(ans, a[p]);}return ans;
}int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> a[i];}init();while (m--) {int l, r;cin >> l >> r;cout << query(l, r) << endl;}return 0;
}

 

 

6.

C++中的std::swap是一个模板函数,用于交换两个变量的值。

std::swap函数是C++标准库中提供的一个泛型函数,它可以交换任何数据类型的两个变量的值。这个函数位于<algorithm>头文件中,使用时需要包含该头文件。std::swap的基本语法如下:

std::swap(a, b);

其中,a和b是要交换值的两个变量,它们可以是同一类型,也可以是不同的类型,因为std::swap是一个模板函数,它可以根据参数的类型自动选择合适的交换方式。

使用std::swap的好处是代码简洁,不需要手动定义临时变量来存储其中一个变量的值,从而避免了可能的错误和提高了代码的可读性。此外,由于std::swap是内联的,它的执行效率通常也很高。

需要注意的是,如果想要在自定义类型中使用std::swap,可能需要提供对应的赋值运算符和移动构造函数,以便std::swap能够正确地交换对象的状态。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS时钟案例

文章目录 1. 演示效果2. 分析思路3. 代码实现 1. 演示效果 2. 分析思路 背景是表盘&#xff0c;不用自己制作然后用CSS的定位做时针&#xff0c;分针和秒针黑点用伪元素::after生成转动用animation实现 3. 代码实现 <!DOCTYPE html> <html lang"en">&…

Java学习笔记 | JavaSE基础语法05 | 方法

文章目录 0.前言1. 方法概述2. 方法的定义和调用2.1 无参数方法定义和调用2.2 带参数方法定义和调用1 带参数方法定义和调用2 形参和实参3 带参数方法练习 2.3 带返回值方法的定义和调用1 带返回值方法定义和调用2 带返回值方法练习13 带返回值方法练习24 带返回值方法练习3 3.…

vim | vim的快捷命令行

快捷进入shell界面 -> :nnoremap <F8> :sh<CR> -> 绑定到了F8 :nnoremap <F8> :sh<CR> 快捷执行 -> :nnoremap <F5> :wa<CR>:!g % -o a.out && ./a.out<CR> -> 绑定到了F5 :nnoremap <F5> :wa<CR>…

【Prometheus】查询数据接口

文章目录 1. 前言1.1. API终端1.2. API状态码说明1.3. API请求返回的格式均使用以下的 JSON 格式2. API接口文档2.1. 查询时间点结果2.1.1. 请求类型2.1.2. URL2.1.3. 请求参数2.1.4. 返回2.1.5. 实例2.2. 查询时间范围结果2.2.1. 请求类型2.2.2. URL2.2.3. 请求参数2.2.3.1. s…

Python学习从0到1 day18 Python可视化基础综合案例 1.折线图

我默记这段路的酸楚&#xff0c;等来年春暖花开之时再赏心阅读 —— 24.3.24 python基础综合案例 数据可视化 — 折线图可视化 一、折线图案例 1.json数据格式 2.pyecharts模块介绍 3.pyecharts快速入门 4.数据处理 5.创建折线图 1.json数据格式 1.什么是json 2.掌握如何使用js…

SqlServer找不到SQL Server Configuration Manager(配置管理)

1、Win键 R &#xff0c;输入 compmgmt.msc 2、找到Sql Server配置管理器

代码随想录-动态规划15(392. 判断子序列、115. 不同的子序列)

392. 判断子序列 class Solution { public:bool isSubsequence(string s, string t) {int m s.size();int n t.size();vector<vector<int>> dp(m1, vector<int>(n1));for (int i1; i<m; i)for (int j1; j<n; j){if (s[i-1]t[j-1]) dp[i][j] dp[i-1…

函数模板及注意事项

一、函数模板 C另一种编程思想称为泛型编程&#xff0c;主要利用的技术就是模板 C提供两种模板机制&#xff1a;函数模板和类模板 函数模板作用&#xff1a; 建立一个通用函数&#xff0c;其函数返回值类型和形参类型可以不具体制定&#xff0c;用一个虚拟的类型来代表。 语…

nginx localtion 匹配规则

1、语法规则 语法规则&#xff1a;location[|~|^~*|^~]/uri/{… } 表示精确匹配,这个优先级也是最高的 ^~ 表示 uri 以某个常规字符串开头&#xff0c;理解为匹配 url 路径即可。 nginx 不对 url 做编码&#xff0c;因此请求为 /image/20%/aa&#xff0c;可以被规则^~ /imag…

演讲嘉宾公布 | 智能家居与会议系统专题论坛将于3月28日举办

一、智能家居与会议系统专题论坛 智能家居通过集成先进的技术和设备&#xff0c;为人们提供了更安全、舒适、高效、便捷且多彩的生活体验。智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代…

Deconstructing Denoising Diffusion Models for Self-Supervised Learning

开头说点题外话&#xff1a;这篇可谓是大咖云集啊&#xff0c;刘壮、谢赛宁、何凯明这些耳熟能详的名字&#xff0c;并且这篇论文一些人也觉得分析特别到位&#xff0c;不愧是大佬视角&#xff0c;配得上“解构”两个字&#xff1b;很巧的是&#xff0c;本科阶段的团队导师也是…

Web框架开发-Ajax

一、 Ajax准备知识:json 1、json(Javascript Obiect Notation,JS对象标记)是一种轻量级的数据交换格式 1 2 它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。…

go 基础中的一些坑

类型转换 在 go 语言中&#xff0c;类型转换是显式的&#xff0c;不会自动转换 go 复制代码 func main(){ i : 100 var f float64 f float64(i) } string 转换成 int 需要借助 strconv 包 使用 strconv.Atoi 函数将 string 转换成 int&#xff0c;转换后它会输出两个值&…

计算机组成原理-5-输入输出系统

5. 输入输出系统 文章目录 5. 输入输出系统5.1 概述5.1.1 I/O系统的发展概况5.1.2 I/O系统的组成5.1.3 I/O设备与主机的连接5.1.4 I/O设备与主机传送信息的控制方式 5.2 I/O设备5.3 I/O接口5.4 控制方式5.4.1 程序查询方式5.4.2 程序中断方式5.4.3 DMA方式5.4.4 程序中断方式与…

vue 控制窗口禁止缩放,已解决

注意&#xff1a;不是浏览器窗口禁止缩放 1.vue框架中&#xff0c;index.html文件head标签中加上内容 <meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, user-scalable0"><script>document.addEventListen…

RabbitMQ 01

01.定义 02.功能

apifox创建接口含中文字符报错的两种解决方案

针对apifox的含中文报错解决方法&#xff1a; 方法一&#xff1a;创建相应接口后&#xff0c;在设置中URL自动编码为WHATING。 方法二&#xff1a;直接将浏览器的url复制到apifox中&#xff0c;浏览器会自动解析配置中文转换路径。

springboot297毕业生实习与就业管理系统的设计与实现

毕业生实习与就业管理系统 摘 要 使用旧方法对毕业生实习与就业管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在毕业生实习与就业管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数…

ADS版图优化方法---使用EM-Cosimulation对版图进行OPTIM

ADS版图优化方法—使用EM-Cosimulation对版图进行OPTIM 一般来说&#xff0c;对原理图进行OPTIM优化的方法大伙用的都比较6了&#xff0c;跑起来也非常快。但是得到版图又可能和原理图的结果差的非常大&#xff0c;为了优化版图又不得不重新对原理图的参数进行调谐优化&#x…

这个国产原型设计工具,建议PM新人一定要用!

Hello小伙伴们&#xff01;我是榛妮&#xff0c;原BAT大厂女产品经理一枚&#xff0c;目前在香港创业。 一转眼&#xff0c;做产品经理已经8年&#xff0c;想想入行时的种种往事&#xff08;尴尬情况&#xff09;&#xff0c;至今仍然历历在目。 说起刚入行时遇到的那些问题&a…