原码、补码、反码扫盲

很多学习编程的童鞋,一定会在入门的时候听说原码、补码、反码之类的东西吧。但是我发现大多数童鞋还是不知道这些东西到底是用来干嘛的,总以为是冯·诺依曼之辈在那里瞎折腾。其实不然,这些东西还是大有用处的。

本文介绍原码、补码、反码的相关知识,至少能够让你了解这些晦涩的东西存在的意义。

如果是高手,请跳过本文。

怎样表示整型数据

计算机中大量地运用着整型数据。整型数据在数学上的意义就是整数,当然这个整数可正可负。以下,我假定你有二进制和十进制互相转换的能力。计算机中数据是以二进制的形式存储的,通常你学过的十进制转换成二进制都是在非负整数的情况下,但是如果我让你转换一个负的十进制数呢?聪明的你也许会在前面加上一个负号,没错,数学上可以这样干。计算机呢?

也许聪明的你会想,那我在计算机有符号的整型数据中保留一位,当它是 0 的时候表示这个整型是正的,当它是 1 的时候表示这个整型是负的,其余二进制位数则按照普通的二进制转换十进制这样来计算。没错,这样是可以唯一地表示每一个(范围内的)整数的,但是,这样会遇到一个问题。

会遇到什么问题

当我们在做减法运算,或者加上一个负数的时候,我们就需要讨论这两个整型的正负了。我们以一个正数减去另一个正数(不妨记为 ab)为例,首先我们需要比较两个数 a, b 的大小,如果 ab 大,那么我们得到一个正数;如果 ba 大,那么我们把 a, b 调换后,作减法,再加上一个负号(即将那个表示符号的二进制位记为 1)。

阅读其余部分 »

PHP 静态页面缓存技术探讨

由于我的服务器是架设在 IXWebHosting 上,其 MySQL 数据库的速度是出名的慢,所以我十分看重网站的缓存。用过 WordPress 的朋友都知道,它有一个插件叫 WP Super Cache, 可以将 WordPress 的页面在第一次生成时储存成静态页面,当再次请求这个页面时,就省去了读取数据库的时间。这里讨论的就是这种技术。

获取 PHP 输出的内容

第一个问题就是怎样获取 PHP 输出的内容了。获取输出内容的原因很简单,因为我们可以把输出的内容储存起来,当访客再次光临的时候就把事先存好的内容给他。

实现这些目的其实也同样简单。我们只要把函数 ob_start() 在内容输出前调用,然后在所有内容输出完成后调用 ob_get_contents() 获取输出的内容,再在此后调用 ob_end_flush() 表示结束就可以了,一个简单的例子如下:

<?php ob_start() ?>

<p>在 PHP 标签之外的输出可以被记录。</p>
<?php echo '<p>echo 等运算符的输出也可以被记录。</p>' ?>

<?php $cache = ob_get_contents() ?>
<?php /* 在这里添加任何处理 $cache 的代码 */ ?>

<?php ob_end_flush() ?>

阅读其余部分 »

C++0x 已然拖成 C++1x

一个热爱 C++ 的程序员应该知道 C++0x 为何物吧。C++ 标准制定委员会曾在 1998 年和 2003 年制定和更新了 C++ 的标准,使 C++ 的编写更规范,功能也得到了提升。但是每次标准的制定后,委员会都会想着下一代的标准,C++ 的下一代就是 C++0x.

但是如今,C++0x 已然被拖成 C++1x. 这是很明显的,现在已经是 2010 了。最新的消息是,C++1x 会在 2010年末最终制定完成,但由于委员会还有一些问题要解决,该标准预计能在 2011 年成为正式标准,通俗地说就是成为 C++11, 说玄乎些也就是 ISO/IEC 14882:2011.

我想大家最感兴趣的是新标准里有些什么。由于这些标准大多数都是外国人定的,有关它的中文信息少之又少,国内对标准的制定也不是很有兴趣,网上见到的文章说的都是 200x 年的预测了,这些预测如今看来也没有多少应验的。目前我忙于准备高考,高考完后我想写一本有关新标准的书。

阅读其余部分 »

GUIDE For Windows 绿色整合版

Windows 下的 OIer 有福了。NOI 官方最近发布的 GUIDE 是一款还算优秀的用于 NOI 系列竞赛的 IDE. 我看了一下,是使用 Qt 库编写的,所以 GUIDE 自然跨平台。GUIDE 与 Linux 的搭配非常好,但是与 Windows 就拙劣了许多,尤其是 C++ 的编译器。并且编译器也是分开提供的,这让很多初学者感到头大。所以今天晚上我用了一点时间,把 GUIDE 的 Windows 版与 C++, C 和 Pascal 的编译器整合在一起,通过一个脚本,实现了环境变量的 Fake. 然后把字体调整成等宽字体,而且是雅黑与 Consolas 的结合,变成了这个绿色整合版,大家看看就知道了。别忘记打开 ClearType 或“平滑屏幕字体边缘”选项。

阅读其余部分 »

找到了动态规划的关键

虽然我编程学得比较早,但是我从 2006 年才开始进行信息学竞赛。当时我们老师在复赛的前一个星期内给我狂补动态规划知识,我回家也自己找点题目做。其实我当时动规掌握的题型很少,但是到考试的时候居然刚好考到我懂的 0-1 背包问题,人品好啊!

三年过来,我做了还算比较多的动规题了。我在研究 NOIp 2007 提高组的《矩阵取数游戏》时,总结三年来做的题目,突然想到了动态规划的关键。动态规划的关键,就是要找状态的表示方法。一旦找到了符合无后效性的状态表示方法,递推方程会很容易想出。那怎样找状态的表示方法呢?我刚刚得出的结论就是,状态的表示要能唯一地表示出当时的实际情况,此时这种表示很可能符合无后效性。

最后一句话,大牛不要嘲笑,更望指点一二,谢谢。