位操作位操作(Bit manipulation)是计算机编程中对位(bit)进行操作的技术,通常用于低级编程和优化。位操作可以对整数的二进制表示进行直接的修改,这在某些情况下比使用高级语言构造更高效。以下是一些基本的位操作:
按位与(AND):操作符 &。两个位都为1时结果才为1。
例如:1011 & 1100 = 1000
按位或(OR):操作符 |。两个位中至少有一个为1时结果为1。
例如:1011 | 1100 = 1111
按位异或(XOR):操作符 ^。两个位不同的时候结果为1。
例如:1011 ^ 1100 = 0111
按位非(NOT):操作符 ~。反转所有位,1变成0,0变成1。
例如:~1011 = 0100
左移(Left Shift):操作符 <<。将位向左移动指定的位数,右边空出的位补0。
例如:1011 << 1 = 10110
右移(Right Shift):操作符 >>。将位向右移动指定的位数,左边空出的位补符号位(算术右移)或0(逻 ...
什么是MakefileMakefile 是一个特殊的文件,通常用于管理和自动化软件的构建过程。它包含了一系列的指令,这些指令定义了如何编译和链接程序。Makefile 与 make 工具一起使用,make 是一个构建自动化工具,它会查找 Makefile 文件,并根据其中的指令来构建程序。
Makefile 的基本结构通常包括以下几个部分:
目标(Targets):这是构建过程中的一个步骤,比如编译一个源文件或安装程序,即最终要生成的目标文件
依赖(Dependencies):目标需要的文件,如果这些文件发生变化,目标将被重新构建,即目标文件由哪些文件生成
命令(Commands):生成目标的命令序列,即通过执行该命令,使依赖文件生成目标文件
基本规则12Targets:Dependencies(tab)Commands
tab不能用空格代替
Makefile文件的命名:makefile或者Makefile
下面是一个简单的makefile文件
12main: main.c func1.c func2.c gcc -o main main.c func1.c func2 ...
网络字节序什么是大端和小端?
大端(高端字节序,网络字节序):低位地址存放高位数据,高位地址存放低位数据
小端(低端字节序):低位地址存放低位数据,高位地址存放高位数据
什么时候使用大端和小端?
大端和小端只是对数据类型长度是两个及以上的,如int,short,对于单字节没限制,在网络中经常需要考虑大端和小端的是IP 和端口
大小端转换函数网络传输用的是大端法
如果机器用的是小端法,则需要进行大小端的转换
下面4个函数就是进行大小端转换的函数
123456#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);
函数名的h表示主机 host,n表示网络network,s表示short,l表示long
上述的几个函数,如果本来不需要转换,函数内部就不会做转换
IP 地址转换函数点分十进制IP转网络IPint i ...
递归非常神奇,说实话,在我大一刚开始接触递归的时候,我就和这个表情包一样。哈哈,废话不多说,进入正题。那么递归到底是怎么实现的,原理是什么?下面我会写出我对递归的理解,希望能帮助大家
什么是递归(Recursion)递归是一种在编程中常用的算法设计策略,通过函数直接或间接地调用自身来解决问题。递归的核心思想是将一个复杂的问题分解成更小的、相似的问题,直到问题变得足够简单,可以直接解决。
它在多种场景下都非常有用。以下是一些常见的使用递归的情况:
树和图的遍历:
二叉树、N叉树、图等结构的深度优先搜索(DFS)和广度优先搜索(BFS)通常使用递归实现。
遍历文件系统或目录结构时,递归可以用来访问每个文件或目录。
分治算法:
递归是分治策略的核心,如归并排序、快速排序等算法,通过递归将问题分解成更小的子问题,解决后再合并结果。
动态规划:
某些动态规划问题,如斐波那契数列、最长公共子序列等,可以通过递归(带备忘录或动态规划表)来解决。
回溯算法:
解决组合问题,如八皇后问题、数独求解器、排列组合问题等,递归用于探索所有可能的解。
数学计算:
计算阶乘、幂运算等数学问题 ...
快慢指针快慢指针是一种常用于链表问题的算法技巧,它主要通过两个指针的不同移动速度来解决某些特定的问题。以下是一些常见的使用快慢指针的场景:
检测链表是否有环:使用快慢指针,快指针每次移动两步,慢指针每次移动一步。如果链表中有环,那么快指针最终会追上慢指针。
找到链表中的环的入口:在检测到链表有环之后,可以通过重置慢指针到链表的头部,然后快慢指针同时移动,再次相遇时的位置即为环的入口。
计算链表中环的长度:在找到环的入口之后,可以通过只移动慢指针来计算环的长度。
删除链表中的环:在找到环的入口后,可以通过调整指针来删除环。
找到链表的中间节点:使用快慢指针,快指针移动两步,慢指针移动一步,当快指针到达链表末尾时,慢指针即为链表的中间节点。
链表的合并:当需要合并两个有序链表时,可以使用快慢指针来分别跟踪两个链表的当前节点,并根据值的大小来合并。
寻找链表的第k个节点:可以使用快指针先移动k步,然后快慢指针一起移动,当快指针到达链表末尾时,慢指针所在的位置就是第k个节点。
快慢指针的关键在于通过控制指针的移动速度来获取链表的某些性质,这种方法在解决链表问题时非常有效。