浅谈位运算及其应用(c++)
目录
- 一、位运算的基础
- (一)位与(&)
- (二)位或(|)
- (三)位异或(^)
- (四)位取反(~)
- (五)左移(<<)
- (六)右移(>>)
- 二、位运算的应用
- (一)设置、清除和检查特定位
- (二)压缩数据存储
- (三)快速计算乘除法
- (四)权限控制和标志位
- (五)实现枚举类型的位标志组合
- 三、位运算的性能优势
- 四、位运算的注意事项
- (一)符号扩展问题
- (二)可移植性
- (三)可读性
- 五、总结
- 例题讲解
- 高低位交换
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 思路
- AC代码
- 异或积
- 题目背景
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 样例 #2
- 样例输入 #2
- 样例输出 #2
- 样例 #3
- 样例输入 #3
- 样例输出 #3
- 提示
- 样例 1 解释
- 样例 2 解释
- 数据规模与约定
- 提示
- 思路
- AC代码
- 「Daily OI Round 1」Xor
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 样例 #2
- 样例输入 #2
- 样例输出 #2
- 提示
- **样例解释**
- **数据范围**
- AC代码
在 C++ 编程中,位运算是一种强大而高效的操作方式,它允许我们直接对数据的二进制位进行操作。这不仅能够提高程序的性能,还能在某些特定的场景下实现一些独特而精妙的功能。在这篇博客中,我们将深入研究 C++ 中的位运算。
一、位运算的基础
(一)位与(&)
位与运算将两个操作数的对应位进行与操作,如果两个位都为 1,则结果位为 1,否则为 0。
int a = 5; // 0101
int b = 3; // 0011
int result = a & b; // 0001,结果为 1
(二)位或(|)
位或运算将两个操作数的对应位进行或操作,如果两个位中至少有一个为 1,则结果位为 1,否则为 0。
int c = 5; // 0101
int d = 3; // 0011
int result = c | d; // 0111,结果为 7
(三)位异或(^)
位异或运算将两个操作数的对应位进行异或操作,如果两个位不同,则结果位为 1,否则为 0。
int e = 5; // 0101
int f = 3; // 0011
int result = e ^ f; // 0110,结果为 6
(四)位取反(~)
位取反运算将操作数的每一位取反,即 1 变为 0,0 变为 1。
int g = 5; // 0101
int result = ~g; // 1010,结果为 -6(考虑符号位)
(五)左移(<<)
左移运算将操作数的所有位向左移动指定的位数,右侧补 0。
int h = 5; // 0101
int result = h << 2; // 010100,结果为 20
(六)右移(>>)
右移运算将操作数的所有位向右移动指定的位数,对于无符号数,左侧补 0;对于有符号数,左侧补符号位。
int i = 20; // 10100
int result = i >> 2; // 00101,结果为 5
二、位运算的应用
(一)设置、清除和检查特定位
通过位与、位或和位异或,可以方便地设置、清除或检查一个整数中的特定二进制位。
int num = 0x12; // 0001 0010
// 设置第 3 位
num |= (1 << 3); // 0001 1010// 清除第 2 位
num &= ~(1 << 2); // 0001 0010// 检查第 4 位是否为 1
bool isSet = (num & (1 << 4))!= 0;
(二)压缩数据存储
在某些情况下,可以使用位运算来有效地压缩数据,减少存储空间的使用。
例如,用一个字节表示 8 个布尔值。
char flags = 0;
flags |= (1 << 0); // 设置第 0 个布尔值为真
flags &= ~(1 << 1); // 设置第 1 个布尔值为假
(三)快速计算乘除法
通过左移和右移可以实现快速的乘以 2 的幂和除以 2 的幂的运算。
int num = 5;
int multiplyBy8 = num << 3; // 相当于乘以 8
int divideBy4 = num >> 2; // 相当于除以 4
(四)权限控制和标志位
在系统编程和权限管理中,常常使用位运算来表示和处理各种权限和标志。
enum Permissions {READ = 1 << 0,WRITE = 1 << 1,EXECUTE = 1 << 2
};int userPermissions = READ | WRITE; // 用户具有读和写权限
(五)实现枚举类型的位标志组合
enum OptionFlags {OPTION_1 = 1 << 0,OPTION_2 = 1 << 1,OPTION_3 = 1 << 2
};void handleOptions(int options) {if (options & OPTION_1) {// 处理 OPTION_1 相关逻辑}if (options & OPTION_2) {// 处理 OPTION_2 相关逻辑}// 以此类推
}
三、位运算的性能优势
位运算通常比普通的算术运算更高效,因为它们直接在硬件层面上操作二进制位,不需要进行复杂的数学计算。
例如,在处理大量数据或者对性能要求苛刻的场景中,使用位运算可以显著提高程序的执行速度。
// 比较使用乘法和左移的性能
#include <iostream>
#include <chrono>void multiply(int n, int times) {for (int i = 0; i < n; ++i) {int result = i * times;}
}void shiftLeft(int n, int times) {for (int i = 0; i < n; ++i) {int result = i << times;}
}int main() {int n = 10000000;int times = 4;auto start1 = std::chrono::high_resolution_clock::now();multiply(n, times);auto end1 = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed1 = end1 - start1;auto start2 = std::chrono::high_resolution_clock::now();shiftLeft(n, times);auto end2 = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed2 = end2 - start2;std::cout << "乘法运算耗时: " << elapsed1.count() << " 秒" << std::endl;std::cout << "左移运算耗时: " << elapsed2.count() << " 秒" << std::endl;return 0;
}
四、位运算的注意事项
(一)符号扩展问题
在有符号数的右移操作中,要注意符号扩展可能导致的结果不一致。
int signedNum = -5;
int shiftedSigned = signedNum >> 1; // 结果取决于编译器的实现,可能不是预期的
(二)可移植性
不同的硬件平台和编译器可能对位运算的处理方式略有不同,尤其是涉及到有符号数的操作。
(三)可读性
位运算虽然高效,但可能会降低代码的可读性。在使用时,应添加足够的注释以说明其目的和逻辑。
五、总结
位运算在 C++ 中是一种强大而灵活的工具,掌握它可以让我们在编程中更加高效地处理数据、优化性能,并实现一些复杂而有趣的功能。但同时,我们也要注意其使用的场景和可能带来的潜在问题,以确保代码的正确性和可维护性。
希望通过这篇博客,您对位运算在 C++ 中的应用有了更深入的理解和认识,能够在实际编程中灵活运用,创造出更优秀的程序。
例题讲解
高低位交换
题目描述
给出一个小于 2 32 2^{32} 232 的非负整数。这个数可以用一个 32 32 32 位的二进制数表示(不足 32 32 32 位用 0 0 0 补足)。我们称这个二进制数的前 16 16 16 位为“高位”,后 16 16 16 位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这个新的数是多少(用十进制表示)。
例如,数 1314520 1314520 1314520 用二进制表示为 0000 0000 0001 0100 0000 1110 1101 1000 0000\,0000\,0001\,0100\,0000\,1110\,1101\,1000 00000000000101000000111011011000(添加了 11 11 11 个前导 0 0 0 补足为 32 32 32 位),其中前 16 16 16 位为高位,即 0000 0000 0001 0100 0000\,0000\,0001\,0100 0000000000010100;后 16 16 16 位为低位,即 0000 1110 1101 1000 0000\,1110\,1101\,1000 0000111011011000。将它的高低位进行交换,我们得到了一个新的二进制数 0000 1110 1101 1000 0000 0000 0001 0100 0000\,1110\,1101\,1000\,0000\,0000\,0001\,0100 00001110110110000000000000010100。它即是十进制的 249036820 249036820 249036820。
输入格式
一个小于 2 32 2^{32} 232 的非负整数
输出格式
将新的数输出
样例 #1
样例输入 #1
1314520
样例输出 #1
249036820
思路
就是一个简单的位移运算
AC代码
#include <iostream>
using namespace std;
unsigned int n;int main()
{cin>>n;cout<<(n >> 16) + (n << 16)<<endl;return 0;
}
异或积
题目背景
id: 4d7e \texttt{id: 4d7e} id: 4d7e
小 H 在课堂上学习了异或运算。
对于两个非负整数 x , y x,y x,y,它们的异或是指,将它们作为二进制数,对二进制表示中的每一位进行如下运算得到的结果:
- x x x 和 y y y 的这一位上不同时,结果的这一位为 1 1 1;
- x x x 和 y y y 的这一位上相同时,结果的这一位为 0 0 0。
x x x 和 y y y 的异或被记为 x xor y x \operatorname{xor} y xxory 或 x ⊕ y x \oplus y x⊕y。
在 C++ 中,你可以用 x ^ y
得到 x x x 与 y y y 的异或值。
另外,若干个数的异或称之为异或和。
题目描述
小 H 还了解到,一个长度为 n n n 的数列 a a a 的异或积是一个等长的数列 b b b,其中 b i b_i bi 等于数列 a a a 中除了 a i a_i ai 以外其他元素的异或和,即
b i = ⨁ j = 1 n [ j ≠ i ] a j b_i = \bigoplus \limits_{j = 1}^{n} [j\ne i] a_j bi=j=1⨁n[j=i]aj
例如,数列 { 1 , 2 , 3 , 4 } \{1, 2, 3, 4\} {1,2,3,4} 的异或积为 { 5 , 6 , 7 , 0 } \{5, 6, 7, 0\} {5,6,7,0}。
异或积变换是指将一个数列用它的异或积替换的过程,由于异或积变换之后数列长度不变,所以异或积变换可以连续进行多次。
现在,小 H 有一个长度为 n n n 的数列 a a a,他想请你帮他计算出 a a a 经过 k k k 次异或积变换之后得到的序列。
输入格式
本题单个测试点内有多组测试数据。
第一行一个整数 T T T,表示测试数据组数。
对于每一组测试数据:
第一行两个整数 n , k n,k n,k。
第二行 n n n 个整数 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an。
输出格式
对于每一组测试数据:
一行 n n n 个整数,表示数列 a a a 经过 k k k 次异或积变换之后得到的数列。
样例 #1
样例输入 #1
1
4 1
1 2 3 4
样例输出 #1
5 6 7 0
样例 #2
样例输入 #2
1
4 2
0 0 0 1
样例输出 #2
0 0 0 1
样例 #3
样例输入 #3
见附件中的 samples/xor3.in
样例输出 #3
见附件中的 samples/xor3.ans
提示
样例 1 解释
此样例即为题目描述中的例子。
样例 2 解释
第 1 1 1 次异或积变换: { 0 , 0 , 0 , 1 } → { 1 , 1 , 1 , 0 } \{0,0,0,1\}\to\{1,1,1,0\} {0,0,0,1}→{1,1,1,0};
第 2 2 2 次异或积变换: { 1 , 1 , 1 , 0 } → { 0 , 0 , 0 , 1 } \{1,1,1,0\}\to\{0,0,0,1\} {1,1,1,0}→{0,0,0,1}。
数据规模与约定
对于 100 % 100\% 100% 的测试数据, 1 ≤ T ≤ 10 1 \le T \le 10 1≤T≤10, 2 ≤ n ≤ 1 0 5 2 \le n \le 10^5 2≤n≤105, 1 ≤ k ≤ 1 0 18 1 \le k \le 10^{18} 1≤k≤1018, 0 ≤ a i < 2 32 0 \le a_i < 2^{32} 0≤ai<232。
测试点编号 | n ≤ n\leq n≤ | k ≤ k \leq k≤ | 特殊性质 |
---|---|---|---|
1 ∼ 3 1 \sim 3 1∼3 | 100 100 100 | 100 100 100 | |
4 ∼ 5 4 \sim 5 4∼5 | 1000 1000 1000 | 1000 1000 1000 | |
6 ∼ 7 6 \sim 7 6∼7 | 3 3 3 | 1 0 18 10^{18} 1018 | |
8 ∼ 10 8 \sim 10 8∼10 | 1 0 5 10^5 105 | 3 3 3 | |
11 ∼ 13 11 \sim 13 11∼13 | 1 0 5 10^5 105 | 1 0 18 10^{18} 1018 | a a a 中所有数的异或和为 0 0 0 |
14 ∼ 15 14 \sim 15 14∼15 | 1 0 5 10^5 105 | 1 0 18 10^{18} 1018 | n n n 为奇数 |
16 ∼ 17 16 \sim 17 16∼17 | 1 0 5 10^5 105 | 1 0 18 10^{18} 1018 | n n n 为偶数 |
18 ∼ 20 18 \sim 20 18∼20 | 1 0 5 10^5 105 | 1 0 18 10^{18} 1018 |
提示
在 C++ 中,对于数据范围 0 ≤ x < 2 32 0\le x<2^{32} 0≤x<232,你可以:
- 使用
unsigned int x
来定义; - 使用
cin >> x
或scanf("%u", &x)
来输入; - 使用
cout << x
或printf("%u", x)
来输出。
思路
可以发现当 n 为偶数时,答案将会在 原来的式子 与 变换一次的式子 之间徘徊。
同样,我们也可以验证 n 是奇数的性质:除第一次外其他都是 变换一次的式子。
只需要特判 n 和 k 均为偶数时即可。
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll T, n; ll k;
ll a[100007], b[100007];
inline void work() {ll sum = 0;for(int i = 1; i <= n; i++) sum ^= a[i];for(int i = 1; i <= n; i++) b[i] = sum ^ a[i];
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>T;while(T--) {cin>>n>>k;for(int i = 1; i <= n; i++)cin>>a[i];if(n % 2 == 0 && k % 2 == 0) {for(int i = 1; i <= n; i++)cout<<a[i]<<" ";cout<<endl;continue;}work();for(int i = 1; i <= n; i++)cout<<b[i]<<" ";cout<<endl;}return 0;
}
「Daily OI Round 1」Xor
题目描述
给定一个长度为 n n n 的序列,一共有 q q q 次询问,每次询问给定正整数 x x x,然后依次执行以下操作:
- 把序列中所有数异或上 x x x。
- 求长度最大的区间 [ l , r ] [l,r] [l,r]( l , r l,r l,r 是非负整数)满足区间中的每个整数在序列中出现,区间的长度定义为 r − l + 1 r-l+1 r−l+1。
注意,在每个询问过后序列是发生变化的。
几个需要说明的地方:
- “区间”指的是数的区间,比如区间 [ 1 , 3 ] [1,3] [1,3] 中的整数有 1 , 2 , 3 1,2,3 1,2,3,与序列无关。
- “序列”指的是修改后的序列,同时不包括之前的序列。
输入格式
第一行两个正整数 n , q n,q n,q 表示序列长度和询问个数。
第二行 n n n 个正整数 a i a_i ai 表示一开始的序列。
接下来 q q q 行,每行一个正整数 x x x 表示一个询问。
输出格式
输出 q q q 行,一行一个整数表示每个询问的答案。
样例 #1
样例输入 #1
5 2
1 2 3 4 5
1
1
样例输出 #1
4
5
样例 #2
样例输入 #2
10 10
5 9 8 3 5 7 10 19 5 24
10
56
19
14
18
53
52
57
96
1000
样例输出 #2
2
2
2
4
2
3
3
2
2
2
提示
样例解释
对于第一组样例,序列初始是 { 1 , 2 , 3 , 4 , 5 } \{1,2,3,4,5\} {1,2,3,4,5},第一次询问给定 x = 1 x=1 x=1,则异或后的序列为 { 0 , 3 , 2 , 5 , 4 } \{0,3,2,5,4\} {0,3,2,5,4}。区间 [ 2 , 5 ] [2,5] [2,5] 中的每个整数 2 , 3 , 4 , 5 2,3,4,5 2,3,4,5 都在这个序列中,这是满足条件的最大区间,所以答案为 5 − 2 + 1 = 4 5-2+1=4 5−2+1=4。
数据范围
本题开启捆绑测试。
Subtask \text{Subtask} Subtask | 分值 | n , q ≤ n,q\leq n,q≤ | a i ≤ a_i\leq ai≤ | x ≤ x\leq x≤ |
---|---|---|---|---|
0 0 0 | 10 10 10 | 1 0 3 10^3 103 | 1 0 3 10^3 103 | 1 0 3 10^3 103 |
1 1 1 | 20 20 20 | 5 × 1 0 5 5\times10^5 5×105 | 1 0 3 10^3 103 | 1 0 3 10^3 103 |
2 2 2 | 10 10 10 | 5 × 1 0 5 5\times10^5 5×105 | 1 0 3 10^3 103 | 5 × 1 0 5 5\times10^5 5×105 |
3 3 3 | 60 60 60 | 5 × 1 0 5 5\times10^5 5×105 | 5 × 1 0 5 5\times10^5 5×105 | 5 × 1 0 5 5\times10^5 5×105 |
对于全部数据,保证: 1 ≤ n , q , a i , x ≤ 5 × 1 0 5 1\leq n,q,a_i,x\leq 5\times10^5 1≤n,q,ai,x≤5×105。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int M = 25, N = 1 << 19 | 5;
int m = 19, n = 1 << m, q, t, x, y;
struct node{int l, r, m, p;
}s[2][N];
inline void pushup(node &u, node &l, node &r)
{u.l = l.p ? l.l + r.l : l.l;u.r = r.p ? r.r + l.r : r.r;u.m = max(l.r + r.l, max(l.m, r.m));u.p = l.p & r.p;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>q>>t;while(q -- )cin>>x, s[0][x] = {1, 1, 1, 1};for(int i = 1, x = 1, y = 0; i <= m; i ++ , x ^= 1, y ^= 1)for(int j = 0; j < n; j ++ )pushup(s[x][j], s[y][j], s[y][j ^ (1 << i - 1)]);while(t -- )cin>>x, y ^= x, cout<<s[1][y].m<<endl;return 0;
}
这是我的第十三篇文章,如有纰漏也请各位大佬指正
辛苦创作不易,还望看官点赞收藏打赏,后续还会更新新的内容。
相关文章:
浅谈位运算及其应用(c++)
目录 一、位运算的基础(一)位与(&)(二)位或(|)(三)位异或(^)(四)位取反(~)&#x…...
Git版本管理中下列不适于Git的本地工作区域的是
Git版本管理中下列不适于Git的本地工作区域的是 A. 工作目录 B. 代码区 C. 暂存区 D. 资源库 选择B Git本地有四个工作区域: 工作目录(Working Directory)、 暂存区(Stage/Index)、 资源库(Repository或Git Directory)、 git仓库(Remote Di…...
webGL + WebGIS + 数据可视化
webGL: 解释:用于在浏览器中渲染 2D 和 3D 图形。它是基于 OpenGL ES 的,提供了直接操作 GPU 的能力。 库: Three.jsBabylon.jsPixiJSReglGlMatrixOsgjs WebGIS: 解释:用于在 Web 浏览器中处理和展示地…...

职场“老油条”的常规操作,会让你少走许多弯路,尤其这三点
有句话说得好:“在成长的路上,要么受教育,要么受教训。” 挨过打才知道疼,吃过亏才变聪明,从职场“老油条”身上能学到很多经验,不一定全对,但至少有可以借鉴的地方,至少能让你少走…...

Ceres Cuda加速
文章目录 一、简介二、准备工作三、实现代码四、实现效果参考资料一、简介 字Ceres2.2.1版本之后,作者针对于稠密矩阵的分解计算等操作进行了Cuda加速,因此这里就基于此项改动测试一下效果。 二、准备工作 1、首先是需要安装Cuda这个英伟达第三方库,https://developer.nvidi…...
微信小程序生成小程序转发链接,携带参数跳转到另外一个页面
🤵 作者:coderYYY 🧑 个人简介:前端程序媛,目前主攻web前端,后端辅助,其他技术知识也会偶尔分享🍀欢迎和我一起交流!🚀(评论和私信一般会回!!) 👉 个人专栏推荐:《前端项目教程以及代码》 ✨一、前言 需求:在页面A生成分享链接(携带参数),分享到微信…...

图解RocketMQ之消息如何存储
大家好,我是苍何。 人一辈子最值得炫耀的不应该是你的财富有多少(虽然这话说得有点违心,呵呵),而是你的学习能力。技术更新迭代的速度非常快,那作为程序员,我们就应该拥有一颗拥抱变化的心&…...

2024年中国信创产业发展白皮书精简版
获取方式: 链接:https://pan.baidu.com/s/1rEHMfcCfJm4A40vzrewoCw?pwda5u1 提取码:a5u1 得益于中国数字经济的迅猛发展,2023年中国信创产业规模达20961.9亿元,2027年有望达到37011.3亿元,中国信创市场…...

Redis2-Redis常见命令
目录 Redis数据结构介绍 Redis通用命令 KEYS DEL EXISTS EXPIRE String类型 Key的层级格式 Hash类型 List类型 Set类型 SortedSet类型 Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String数据库,value的类型多种多样 可以通过…...

一天攻克一个知识点 —— 设计模式之动态代理
一、设计模式之代理设计 代理设计是在Java开发中使用较多的一种设计模式,所谓的代理设计模式就是指一个代理主体操作真实主体,真实主体操作具体业务,代理主体负责给具体业务添砖加瓦。 就好比在生活中你有一套房子想要出租(你真实主体)&…...

数据采集与预处理【大数据导论】
各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 数据采集与预处理前 必看 【大数据导论】—大数据序…...
白骑士的PyCharm教学进阶篇 2.2 高级调试技术
系列目录 上一篇:白骑士的PyCharm教学进阶篇 2.1 高效编码技巧 在Python开发中,调试是一个非常重要的环节。PyCharm作为一款功能强大的IDE,不仅提供了基本的调试功能,还包含了许多高级调试工具与技巧。本篇将详细介绍这些高级调试…...

[网鼎杯]2018Unfinish
使用ctf在线靶场https://adworld.xctf.org.cn/home/index。 进入靶场,发现是一个登录页面。 使用awvs进行扫描,发现存在login.php和register.php,并且register.php存在sql注入漏洞。 访问一下register.php试试,发现是一个注册页面…...
Java算法-力扣leetcode-383. 赎金信
383. 赎金信 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1:…...

使用idea对spring全家桶的各种项目进行创建
目录 1. 简介2. spring2.1 简介2.2 创建 3. springmvc3.1 介绍3.2 创建 4. springboot4.1 简介4.2 创建(仅仅就其中一种) 5. 其他:maven6. 参考链接 1. 简介 因为总是分不清spring全家桶,所以就在这里进行一个总结。 2. spring …...
FAT32、NTFS、FAT的区别
FAT(File Allocation Table) 特点 簇大小限制:FAT文件系统的簇大小是固定的,这限制了单个文件的大小和文件系统的效率。 存储效率:由于簇大小的限制,FAT文件系统在存储小文件时可能会浪费空间。 文件系统结…...

捉虫笔记(二)之 杀软请你自重点
捉虫笔记(二)之 杀软请你自重点 前一篇文章介绍了如何配置符号,这一篇文章我们来个实战。 1 现象 在我们的程序中利用robocopy进行文件的复制。但是QA反馈,只要进行了备份操作,整个进程就会卡住。但是奇怪的是只有他…...

python学习之路 - python的函数
目录 一、python函数1、函数介绍2、函数的定义3、函数的参数4、函数的返回值5、函数说明文档6、函数的嵌套调用7、变量的作用域8、综合案例9、函数与方法的区别 二、python函数进阶1、函数多返回值2、函数多种传参方式a、位置参数b、关键字参数c、缺省参数d、不定长参数 3、匿名…...

使用SpringBoot+Vue3开发项目(2)---- 设计文章分类的相关接口及页面
目录 一.所用技术栈: 二.后端开发: 1.文章分类列表渲染: 2.新增文章分类: 3.编辑文章分类: 4.删除文章分类 : 5.完整三层架构后端代码: (1)Controller层:…...
Layui---toolbar与 tool的区别
table.on(toolbar): table.on(toolbar): 这个事件监听器是用来处理表格工具栏的事件。工具栏通常位于表格的上方,可以包含添加、删除、导出等按钮。当用户与这些工具栏中的按钮交互时,比如点击一个按钮来添加新行或者进行搜索操作,…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...