java 操作符
基础c++中没有 >>>(逻辑右移)操作符,这是在java中才有的。c++想要实现逻辑右移的功能要么进行更复杂的运算要么用unsigned。这篇博客中详细讲了算术右移和逻辑右移
浮点数不支持移位运算。并且如果其中一个浮点数是double型,结果就是double型。
逻辑运算符(部分)
操作
&&
短路与
&
非短路与
两竖线
短路或
一竖线
非短路或
短路与非短路的区别是对于短路运算符如果左边可以判断,那么就不会去判断右边。非短路运算符无论条件如何都会执行两边。
非短路运算符的作用是有时我们先要进行一些运算再判断,非短路运算符可以确保运算的执行。例如 if(b == true & (output+=10) == 20 ).其中output+=10就是运算,
==操作符在对象中当==操作符在对象中时,两个引用变量必须是引用同一个对象,结果才为true。
例:Integer int1 = new Integer(1);Integer int2 = new Integer(1);Integer int3 = ...
java 类的生命周期
类的加载连接和初始化
加载: 查找并加载类的二进制数据
链接: 包括验证,准备和解析类的二进制数据
验证: 确保加载类的正确性。
准备: 为类的静态变量分配内存,将其初始化为默认值(也就是0)
解析: 将类的符号引用变成直接引用 1
初始化: 把类的静态变量赋予正确的初始值。
类的加载类的加载是指把类的.class文件中的二进制数据读入到内存中,把它存放在方法区中。然后再去装载一个java.lang.Class对象,用来封装类在方法区的数据结构。通俗的来讲就是把代码加载到内存中。
类的加载是由虚拟机自带的加载器来完成的,但是我们也可以自己去定义。用java.lang.ClassLoader类的子类的实例。
类加载器允许某个类将要被使用时预先加载它。如果预先加载过程中遇到了.class的错误。那么类加载器在首次主动使用这个类的时候报错(LinkageError)
类的链接类的验证
类的验证主要验证一下内容:
类文件格式, 看看后缀是否符合
语义检查 看看是否符合java语义(例如把一个String给int或final是否有子类)
字节码验证,字节码代表java方法。
二进制 ...
git操作
git status: 查看当前工作区修改状态
git add: 添加到暂存区
git commit -m “…”: 将暂存区内容添加到仓库
git diff + 文件名: 查看当前文件和上次提交文件的不同
git log: 查看提交历史
git reflog: 查看命令历史,来确定要回到未来某个版本
git reset —hard commit_id: 回退到某个版本,commit_id可以通过git log或git reflog查看。回退之后也可以使用这个命令回到未来的版本。
git reset —hard HEAD^: 表示回退到上一个版本,一个^表示上一个.如果是HEAD^^则是上上个版本。用HEAD~100表示上一百个版本。
git checkout — file: 回退到上一次提交的版本(如果用了add就是在暂存区的内容,如果没用就是仓库中的内容)。file是文件名。
git rm: 将删除文件的命令提交到暂存区。当然如果在工作区删除了文件的话使用git add也是可以的。
远程仓库:
git remote add origin git@github.com:xinh ...
无线网络与移动网络
基础名词
无线链路: 决定无线链路好坏的有两个特性: 覆盖区域和链路速率
基站: 基站负责向与之关联的无限主机发送数据和从主机那里接受数据。但是和交换机或路由器还有些不同,它只负责传输数据,其他诸如路由选择,地址分配,DNS名称转换服务都是主机自己沟通。
无线网络和有线网络在信号上有着显著区别
递减信号强度: 穿过物体信号减弱
其他源干扰: 同一个频段的信号会相互干扰。
多径传播: 电磁波受物体反射和地面反射,会使发送方和接收方之间形成了许多长度不等的路径,使接收方收到的信号模糊。
信噪比(SNR)是收到的信号和噪声强度的比值,也就是说信噪比越高这个信号越可信。
比特差错率(BER)是接收方收到有错传输比特的概率。
比特传输率: 也可以认为是传输速度
对于一定信噪比来说,传输率越高,比特差错率越低。并且传输率越高,需要越高的信噪比才可以保证比特差错率,但是传输率越高越费电。
WIFI: 802.11
体系结构该体系结构基本模块为基本服务集(BSS)。一个BSS中有一或多个无线站点和一个叫接入点(AP)的中央基站。中央基站类似于以太网,都有MAC地址。
信道与关联每个无线站点要发 ...
骑砍2 mod类列举
基础参考1: 非官方文档
参考2: 有关保存数据的讨论
本文只是为了记录自己看到和使用的一些类的大致用途和一些主要方法,具体请使用dnspy等工具进行查看。
dnspy的分析功能很好用。还有程序集搜索功能
类
settlement: settlement是在战役地图中的村庄,城镇,城堡
MobileParty: 军队
TroopRoster: 军队花名册
PrisonRoster: 囚犯花名册
TickAi(): 最终决定ai的函数,下面的aibehavior不一定是最终的ai
Morale: 士气,通过DefaultPartyMoraleModel决定
DefaultBehavior: 当前的ai
ShortTermBehavior: 短期ai,用来设置追逐和逃跑行为
ItemRoster: 物品清单。
InventoryCapacity: 容量,通过InventoryCapacityModel得到
Tier: 部队的等阶,最高是6阶,英雄是0阶
GetBestInitiativeBehavior(): 里面有一些模拟战的行为
Army: 军团,也就是需要凝聚力的那个
Ho ...
位运算和移位运算
与运算这里的与运算并不是平常的bool运算,而是按位与。这种运算比加减法快
符号: &
例: 1010&1000=1000 1001&0110=0000
含义: 1&1=1,1&0=0,0&1=0,0&0=0,只要不是两个都是,1,那么结果就是0
应用:
替换指定位的值
一个典型应用就是大小写转换,如果平常转换我们可能要写一大堆,但是经过仔细观察后发现大写字母和小写字母之间差距只有第5位,如果第五位为0,就是大写字母,为1就是小写字母,所以只要a&0b11011111这一段代码就可以完成小写到大写的转换
清零
通过 a&0b00000000 ,可以快速的把某个数变成零
消去最后一位 1
x & (x-1) 例如 x 1010 x-1 1001 ,计算之后1000。减1就是让最小的那个1变成0然后后面全是1
找到最小一位1
x & (-x) 在lowbit函数中用到, -x=~(x-1),大于最小一位1的都由于取反变成0,然后最小一位1及其后面本来是0111…,取反变成1000…,而原 ...
DLL注入
消息钩子Windows操作系统GUI将键盘敲击,鼠标移动和点击,窗口大小和位置改变都看成事件(Event).消息传递过程大致为
事件发生时,首先将这个事件添加到系统的[OS message queue]中
OS判断这个事件是在哪个应用程序中产生的,然后将这个事件添加到应用程序的消息队列中
应用程序对这些消息进行处理
消息钩子就在这个传递链过程中添加一些函数,这些函数可以侦听事件甚至修改事件的参数。
SetWindowsHookEx这个API可以实现消息钩子,它的定义如下HHOOK SetWindowsHookEx{ int idHoook; HOOKPROC lpfn; HINSTANCE hMod;//这个程序所属DLL句柄 DOWRD dwThreadId;//想要挂钩的线程Id}
DLL注入DLL注入指的是想运行中的进程强制插入DLL文件。具体来讲就是让其他进程调用LoadLibrary().
具体方法
创建远程线程
使用注册表
消息勾取
创建远程线程bool inject_dll(DWORD dwPID, LPCTSTR sz ...
PE文件格式
PE文件时windows中的32位可执行文件。在linux中是elf。如exe,dll,scr等都是PE文件
基本结构
PE文件中的RVA(相对虚拟地址)一般不是直接转换到真实的虚拟地址的,还要加上一个基准地址(ImageBase).也就是说VA = RVA + ImageBase
这样做主要是因为DLL,DLL动态链接时如果发现这个虚拟地址已经有其他的dll了,那么就要进行重定位到其他位置,如果没有ImageBase那么重定位是很麻烦的。
PE头DOS头typedef struct _IMAGE_DOS_HEADER{ WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_crlc; WORD e_cpaarhdr; WORD e_minalloc; WORD e_maxalloc; WORD e_ss; WORD e_sp; WORD e_csum; WORD e_ip WORD e_cs; WORD e_lfarlc; WORD e_ovno; ...
红黑树
性质红黑树是一颗二叉搜索树,并且在每个节点上增加一个变量来储存颜色,可以是红或者是黑。红黑树保证了没有一条路径会比其他路径长两倍。
每个节点有五个属性:color、key、left、right、p(parent)。
红黑树满足以下性质:
根节点是黑色
每个叶结点是黑色的。
如果一个节点是红色,则两个子节点是黑色
对于每个节点,从这个节点到所有后代节点的简单路径上,均包含相同数目的黑色节点。
在叶结点中不存在值,可以用一个哨兵节点来代指叶结点。哨兵节点颜色为黑,其他值任意,之后一旦到叶结点就连接到哨兵,这样可以减少空间占用。
从某一节点出发(不包含这个节点)的任意一条简单路径上黑色节点的个数叫这个点的黑高。定义红黑树的黑高是根节点的黑高。
可以证明,节点数为n的红黑树高度至多为2lg(n+1).
旋转插入和删除可能会改变红黑树的性质,这个时候就需要通过旋转来恢复红黑树的性质。
左旋的过程是把y的左边给x,然后x变为y的左儿子。右旋可以类比。
注意: 旋转之后性质不改变并且旋转的两个节点颜色可以互换。
左旋函数:
void left_rotate(node* t, node* x)& ...
内存管理
段式管理段指的是一些有相似功能的程序集合(不是准确描述),例如程序段,代码段,全局变量段等。
段的分配算法固定分区法事先把磁盘分为大小固定的分区,之后有进程来了就将它放入可以容纳的分区中。每个分区大小可以不一样,如4k,8k等。
这种方法最大的问题就是会产生很大的内碎片。例如没有空间使用了,然后来了一个大小为1k的进程,这时一块16k的分区释放了,这个进程只能进这个空间,于是浪费了15k的空间。
还可以对每个大小的分区使用一个列表。列表中存放的是可以被这个空间容纳的进程。进程先是按照大小分配到这些列表中,然后再进行运行。
这种方法可以减小每个分区的内碎片,但是不一定能提高系统总的空间利用率,因为可能进程集中于某一个大小的分区,这样其他的分区就没有得到充分利用。
可变分区法可变分区法就是开始不分区,等进程来了之后再分配它需要的大小给他。这种方法可以使用一个链表进行维护,每次来了一个进程就记录内存起始位置和终止位置。
最先适配:从一个方向进行扫描,找到第一个可以容纳的空间放入进程
下次适配:从上次分配的地方开始扫描,实际上差别并不大
此外还有两种有两种策略,最好匹配和最差匹配。最好匹配 ...