cpp杂项知识点(一)

news2024/11/23 21:22:40

大小端验证

代码如下:

#include <iostream>
#include <stdio.h>
#include <memory>
#include <string.h>
#include <string>

using namespace std;

void 
hexdump(
  	void *pSrc, 
  	int len
)
{
	unsigned char *line;
	int i;
	int thisline;
	int offset;

	line = (unsigned char *)pSrc;
	offset = 0;

	while (offset < len)
	{
		printf("%04x ", offset);
		thisline = len - offset;

		if (thisline > 16)
		{
			thisline = 16;
		}

		for (i = 0; i < thisline; i++)
		{
			printf("%02x ", line[i]);
		}

		for (; i < 16; i++)
		{
			printf("   ");
		}

		for (i = 0; i < thisline; i++)
		{
			printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
		}

		printf("\n");
		offset += thisline;
		line += thisline;
	}
}

void test02()
{
    unsigned int  u1 = 0;
    unsigned int  u2 = 4294967295;
    unsigned int  u3 = 2147483648;
    unsigned int  u4 = 2147483647;
    int i1 = 5;
    hexdump(&i1, sizeof(i1));
    hexdump(&u1, sizeof(u1));
    hexdump(&u2, sizeof(u2));
    hexdump(&u3, sizeof(u3));
    hexdump(&u4, sizeof(u4));
}
int main()
{
    test02();
    return 0;
}

hexdump函数的作用是打印指定内存的十六进制形式内容,结果如下:

[root@VM-28-4-centos test]# ./test1 
0000 05 00 00 00                                     ....
0000 00 00 00 00                                     ....
0000 ff ff ff ff                                     ....
0000 00 00 00 80                                     ....
0000 ff ff ff 7f                                     ....

可以看出 i1 为 5,我们实际书写的时候应该是 00 00 00 05, 但是内存打印的结果是颠倒的,数据低位存到地址低位,即小端字节序(机器字节序)。

C语言移位的问题

  • 右移只对无符号数 (unsigned) 进行右移
  • 移位数大于0,小于位数

使用 C++ 的 bitset 进行位操作

#include <iostream>
#include <bitset>
using namespace std;

void test01()
{
	bitset<10> priv = 0x7F; // 当前拥有的权限值
	bitset<10> P_BAKUP = (1 << 6);
	bitset<10> P_ADMIN = (1 << 7);

	cout << priv << endl;
	cout << P_BAKUP << endl;
	cout << P_ADMIN << endl;

	if((priv & P_BAKUP) == P_BAKUP)
	{
		cout << "P_BAKUP" << endl;
	}

	if((priv & P_ADMIN) == P_ADMIN)
	{
		cout << "P_ADMIN" << endl;
	}
}

int main()
{
	test01();
	return 0;
}

字符串的指针表示相关

void test05()
{  
    // 可以通过strArr[i] 修改值,但不能修改 strArr,数组名是
    char strArr[11] = {"helloworld"};

    // 不能通过pStr[i]方式修改值,因为 "helloworld"在常量区
    char *pStr = "helloworld"; 
    pStr = strArr; // OK
    strArr = pStr; // ERROR,数组名不是可修改的左值
    

    for(int i = 0; i != 10; ++i)
    {
        strArr[i] += 1;
        cout << strArr[i];
    }
    cout << endl;

    for(int i = 0; i != 10; ++i)
    {
        pStr[i] += 1;
        cout << pStr[i];
    }
    cout << endl;

}

auto_ptr

很类似于 unique_ptr

所有权转移:若不小心把 auto_ptr 对象传递给另外 auto_ptr,原来的指针就不再拥有这个对象了。 在拷贝/赋值过程中,会直接剥夺指针对原对象对内存的控制权,转交给新对象,然后再将原对象指针置为 nullptr

auto_ptr 在 C++17 已废弃

有了指针为什么还需要引用?

为了支持运算符重载

有了引用为什么还需要指针?

为了兼容C语言,

利用模板的编译期多态实现计算

使用模板类实现 1+2+3+….+ 100 :

template<int n>
struct Sum
{
    enum Value {N = n + Sum<n-1>::N};
};

template<>
struct Sum<1>
{
    enum Value {N = 1};
};


int main() {
    cout << Sum<100>::N << endl;
    return 0;
}

上述的代码在编译期就完成了运算,查看反汇编代码的时候可以看出直接得到了结果

全排列和STL的排列函数使用

要求:求得"123" 的全排列,即 123,132, 213, 231, 312 ,321

使用回溯手动实现的方法:

#include <iostream>

using  namespace std;

// 全排列
void permutation(char *pStr, char *pBegin)
{
    if(*pBegin == '\0')
    {
        cout << pStr << endl;
        return;
    }

    for(char *p = pBegin; *p != '\0'; ++p)
    {
        swap(*pBegin, *p);
        permutation(pStr, pBegin + 1);
        swap(*pBegin, *p);
    }
}


int main()
{
    char test[] = "123";
    permutation(test, test);
    return 0;
}

使用STL提供的方法 next_permutation,默认获取升序的下一个排列

char test[] = "132";
cout << endl;
do {
    cout << test << endl;
}while(next_permutation(test, test + 3));

使用异或来交换数字要注意处理相同的数交换

若不对相同的数处理,则会导致相同的数交换结果为0,因为相同异或结果为0

void swap(int &a, int &b)
{
    if(a == b) return;
    a = a^b;
    b = a^b;
    a = a^b;
}

汇编相关

VC++传参是从右往左传参的

在这里插入图片描述

调用函数时,压入参数之后,接着是压入函数调用点的位置,从而函数退出时能回到调用点

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

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

相关文章

Java的集合框架和泛型

文章目录 集合框架什么是集合框架类和接口总览 集合框架的重要性背后所涉及的数据结构以及算法什么是数据结构容器背后对应的数据结构什么是算法 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 泛型什么是泛型引出泛型语法泛型类泛型的上界(没有下界)泛型方法…

Vue2学习第三天

Vue2 学习第三天 1. 计算属性 computed 计算属性实现 定义&#xff1a;要用的属性不存在&#xff0c;要通过已有属性计算得来。 原理&#xff1a;底层借助了Objcet.defineproperty方法提供的getter和setter。 get函数什么时候执行&#xff1f; 初次读取时会执行一次。当依赖…

知识图谱:py2neo将csv文件导入neo4j

文章目录 安装py2neo创建节点-连线关系图导入csv文件删除重复节点并连接边 安装py2neo 安装python中的neo4j操作库&#xff1a;pip install py2neo 安装py2neo后我们可以使用其中的函数对neo4j进行操作。 图数据库Neo4j中最重要的就是结点和边&#xff08;关系&#xff09;&a…

数字经济政策 | ZF工作报告-60个文本词频

根据各省政府工作报告&#xff0c;参考金灿阳(2022)和陶长琪(2022)&#xff0c;借助Python软件&#xff0c;统计数字经济相关的关键词词频&#xff0c;分别记为数字经济政策词频A、数字经济政策词频B A文献参考 B文献参考 年度趋势 一、数据介绍 数据名称&#xff1a; 政府工…

OpenAI首个文生视频模型亮相,你觉得咋样?

2月16日凌晨&#xff0c;OpenAI再次扔出一枚深水炸弹&#xff0c;发布了首个文生视频模型Sora。据介绍&#xff0c;Sora可以直接输出长达60秒的视频&#xff0c;并且包含高度细致的背景、复杂的多角度镜头&#xff0c;以及富有情感的多个角色。 目前官网上已经更新了48个视频d…

QGIS004:【08图层工具箱】-导出到电子表格、提取图层范围

摘要&#xff1a;QGIS图层工具箱常用工具有导出到电子表格、提取图层范围等选项&#xff0c;本文介绍各选项的基本操作。 实验数据&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ZK4_ShrQ5BsbyWfJ6fVW4A?pwdpiap 提取码&#xff1a;piap 一、导出到电子表格 工具…

集团企业大数据应用:突破痛点,释放数据价值

在数字经济日益崛起的背景下&#xff0c;集团企业以其管理范围广泛、业务领域多元化和分支机构复杂化的特性&#xff0c;在市场竞争中扮演着重要角色。为了维持和提升这种竞争力&#xff0c;大数据应用成为了集团企业不可或缺的战略工具。然而&#xff0c;在实际应用中&#xf…

图表示学习 Graph Representation Learning chapter1 引言

图表示学习 Graph Representation Learning chapter1 引言 前言1.1图的定义1.1.1多关系图1.1.2特征信息 1.2机器学习在图中的应用1.2.1 节点分类1.2.2 关系预测1.2.3 聚类和组织检测1.2.4 图分类、回归、聚类 前言 虽然我并不研究图神经网络&#xff0c;但是我认为图高效的表示…

javascript+css+html购物车案例

javascript代码部分主要实现三部分功能 1、商品数量增加&#xff08;减少&#xff09;同时小计增加&#xff08;减少&#xff09; 这部分主要是通过for循环给增加&#xff08;减少&#xff09;按钮绑定点击事件 1&#xff09;点击后计数器自增&#xff08;自减&#xff09;…

【深度学习:开源数据注释】开源数据注释完整指南

【深度学习&#xff1a;Automated Data Annotation】开源数据注释完整指南 什么是开源数据标注工具&#xff1f;您会使用开源标签工具做什么&#xff1f;主要的开源数据标注工具有哪些&#xff1f;CVATMONAI LabelLabelMeRIL-ContourSefexa 使用开源注释工具的优点和缺点是什么…

Sora:将文本转化为视频的创新之旅

一.能力 我们正致力于让 AI 掌握理解和模拟物理世界动态的能力&#xff0c;旨在培养能够协助人们解决现实世界互动问题的模型。 介绍 Sora——我们开发的文本到视频转换模型。Sora 能够根据用户的输入提示&#xff0c;生成最长达一分钟的高质量视频内容。 目前&#xff0c;Sora…

Gitee入门之工具的安装

一、gitee是什么&#xff1f; Gitee&#xff08;码云&#xff09;是由开源中国社区在2013年推出的一个基于Git的代码托管平台&#xff0c;它提供中国本土化的代码托管服务。它旨在为个人、团队和企业提供稳定、高效、安全的云端软件开发协作平台&#xff0c;具备代码质量分析、…

揭开Markdown的秘籍:引用|代码块|超链接

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Markdown指南、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️Markdown 引用1.1 &#x1f514;引用1.2 &#x1f514;嵌套引用1.3 &…

【Python---六大数据结构】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python---六大数据结构 往期内容前言概述一下可变与不可变 Number四种不同的数值类型Number类型的创建i…

【Spring篇】Spring的创建与使用

目录 一 . 创建Spring项目 二 . Bean 对象存放到 Spring 三 . 从Spring中读到Bean 经过前⾯的学习我们已经知道了&#xff0c;Spring 就是⼀个包含了众多⼯具⽅法的 IoC 容器。既然是容器那么 它就具备两个最基本的功能&#xff1a; 将对象存储到容器&#xff08;Spring&am…

optee CA/TA flow

以 TEEC_InvokeCommand 为例 CA—normal world EL0 //imx-optee-client\libteec\src\tee_client_api.c TEEC_InvokeCommandioctl(session->ctx->fd, TEE_IOC_INVOKE, &buf_data)通过syscall陷入内核态driver linux driver—normal world EL1 tee_ioctl // drive…

一些方便的记录

如何在ubutun上安装qq 在QQ官网选择QQ Linux版本&#xff0c;然后选择X86下的deb类型文件进行下载 sudo dpkg -i linuxqq_3.2.5-21453_amd64.deb64 根据下载的版本不同对其进行更改 运行上述命令后显示应用程序可以看到安装后的QQ面板如何卸载安装在gnuradio的lora组件 - 进入…

php基础学习之可变函数(web渗透测试关键字绕过rce和回调函数)

可变函数 看可变函数的知识点之前&#xff0c;蒟蒻博主建议你先去看看php的可变变量&#xff0c;会更加方便理解&#xff0c;在本篇博客中的第五块知识点->php基础学习之变量-CSDN博客 描述 当一个变量所保存的值刚好是一个函数的名字&#xff08;由函数命名规则可知该值必…

Eclipse Version: 2023-03 (4.27.0) JDK19 Tomcat10.2

Eclipse Version: 2023-03 (4.27.0) JDK19 Tomcat10.2

电子元器件基础5---二极管

除了电阻、电容和电感等线性元器件之外,还有二极管、三极管这些常用的非线性器件广泛应用于日常生活中。那么今天我们来介绍以下二极管这一常用的电子元器件。 一、二极管概念 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件 。二极管有两个电极,正极,又叫阳极;负…