1.1 如何让任务管理器的CPU占用曲线听你指挥
起初我以为可以达到这样的效果
http://www.acfun.tv/v/ac720574
结果发现完全是我自己的一厢情愿,或者说作者根本没往更深层次的地方去想(我没有任何不重视作者的意思,只是确实与我的想法差得很远)
首先这一节的内容完全是在讨论如何用软件来占用CPU使用量,没有别的了,而我第一思路却是想任务管理器的画曲线函数是不是在一个dll里面,然后替换dll来实现接管画曲线函数,或者是不是可以接管任务管理器的画曲线函数句柄HDC这样的思路,不知道是不是因为我是学生的缘故,想到的层面跟本书完全没有交集。看了本书的代码之后发现本书的代码局限性很大,而且它自己也在讨论这一小节内讲到了多核以及X64架构下的CPU,总之我对1.1节的解法不是很满意。目前还是读书笔记,有机会的话我会在以后的博客中稍微介绍一下,因为我还没去学习上面链接的视频中这么高超的技术。当然,话说回来,关于任务管理器的这道题的解题还是让人稍微有点启发的,至少它让我学到了GetTickCount这个函数,没有再多了。
1.2 中国象棋将帅问题
这题目最大限制条件就是只能用1个字节的内存,题目本身是非常非常的基础。
先说说我的思路,很容易的,肯定是用bit来表达位置,但是我并不是采用1-9编号,而是,x,y坐标的定位,因为答案必然是将帅的x坐标不同,至于y没任何影响。
因此我将8位分成4部分每部分2bits,表示范围0-3,4*4 = 16 足够表示9个点。判断能否输出的关键就是(x1^x2)这个表达式是否为1,我首先想到的是用bitset<2> 然后 ulong()输出十进制,然后看了书中的代码发现貌似很麻烦的解法因为书中的代码使用1-9编号,所以判断的时候都需要MOD3,但是书本依然说效率高,私以为MOD完全没有位运算效率高。好吧,到这里可能大家会说bitset的效率呢,难道很高么,好吧,其实我也不知道。于是看完代码1-7的代码之后,我自己将它往我的思路改写,将a:4 b:4 改写为 x1:2 x2:2 y1:2 y2:2里面的MOD3 我也去掉了。
接下来打出1-7的代码和我的代码 作对比
1-7
struct{
unsigned char a:4;
unsigned char b:4;
}i;
for( i.a = 1; i.a < 9; i.a++ )
for( i.b = 1; i.b <= 9; i.b++ )
if( i.a % 3 != i.b % 3 )
printf(...);
我的代码
struct{
unsigned char x1:2;
unsigned char x2:2;
unsigned char y1:2;
unsigned char y2:2;
}i;
for( i.x1 = 0; i.x1 < 3; ++i.x1 )
for( i.x2 = 1; i.x2 < 3; ++i.x2 )
两个for循环y1 y2
if(x1^x2)
printf(...);
其实我对效率根本没那么高要求,都是书本中的四个字,效率最高,导致我一下子就开始钻牛角尖了。首先1-7中的每次循环内都是i.a++而不是++i.a,这点就稍微影响了效率。
我并不是说我的效率很高,毕竟我写了四个循环,对于CPU来说执行效率应该也有很大的影响,但是我的异或运算也肯定比MOD更快,最后我只能说这本书的内容不够严谨。
本篇博客到此结束,欢迎大家提出意见,相互学习。