Featured

试译 John Gordon 的 Alice and Bob 餐后演讲(未完待续)

首次尝试翻译学术向的文章。这是一篇经典的,风趣的演说稿,现在网上流传的中译本有些谬误,故试译以改正之。


关于 Alice 和 Bob 的餐后演讲
作者 John Gordon
受 James Massey 教授之邀,于 Zurich Seminar 学术研讨会,1984 年 4 月

由 Zhaoyang 译出,参考了 Friendren 的译文
英文原文于 http://downlode.org/Etext/alicebob.html

女士们,先生们,晚上好。

  人们参加这样的学术会议,肯定希望有点更轻松的东西,能让他们换个节奏、换种风格,把专业的事情放在一边,想一些完全不同的东西。

  所以呢,咱们聊聊编码理论。在座的有些同仁不是编码理论的专家,而是不怎么情愿地被差遣来的。于是我想我可以来个五分钟的速成课程,像面对研究生那样给大家扫盲一下编码理论。

  编码理论的专家关心两件事。第一件,即最重要的一件,是两个人的私人生活—— Alice 和 Bob。在本领域的论文中,若一位学者想描述一个涉及双方的业务过程,他不会称双方为A和B,而是遵从一个长期形成的传统,称他们为 Alice 和 Bob。

  现在已经有数百篇关于 Alice 和 Bob 的论文了。数年来,Alice 和 Bob 尝试过欺诈保险公司,通过电子邮件玩高赌注的扑克游戏,还在被窃听的电话线上交换秘密信息。

  如果我们把这些散落在论文里的细节整理一番,我们就可以得到关于这两人生活的一副美妙图画。这可能将是大家首次听到 Alice 和 Bob 的确切传记。

  在美国作者撰写的论文中,Bob 常常在向投机商卖股票。根据 Bob 参与的股票交易的数目,我们推断他很可能是一名股票经纪人。然而他也非常在意自己是否被窃听,所以估计他活跃在什么反政府活动之中。注意到 Alice 曾多少次试图从 Bob 手中购买股票,我们知道 Alice 很可能就是一个投机商。此外,Alice 非常担心她与 Bob 的经济往来被她丈夫发现。所以说 Bob 是一个背地里从事破坏活动的股票经纪人,Alice 是一个脚踩两只船的投机商人。

   Alice 需要面对不少难题。她和 Bob 只通过电话或电子邮件来交流。在他们居住的那个国家的电话费很贵,可偏偏两人都很吝啬。所以 Alice 首先要设法将电话费降到最低。

  另外,电话线上总有很大的噪音。由于干扰之强,Alice 和 Bob 经常难以听清对方。电话线上还有不少非常强大的敌人,比如税收当局,比如秘密警察。这是个坏消息,因为二人感兴趣的话题正是税务欺诈和反政府。

  这些敌人有几乎无限的资源可用。他们总守在电话线旁,监听 Alice 和 Bob 的通话。这些敌人也很狡猾,他们最爱玩的把戏就是装作 Bob 给 Alice 打电话。

  你可能会想,Alice 只要仔细辨别 Bob 的嗓音就可以了。但是不行,事实上 Alice 与 Bob 从未谋面,Alice 根本不知道 Bob 的声音是什么样的。

  于是,你看到,Alice 面对着这么多棘手的问题。对了,忘了说,Alice 并不信任 Bob。我们不知道个中缘故,但肯定是过去发生过什么事情。

  如果在 Alice 的处境下,大多数人都会放弃。但 Alice 没有。她有令人敬畏的勇气。无惧艰险,在嘈杂的电话线上,尽管被税收当局和秘密警察监听着,Alice 还是会愉快地尝试与一个她并不信任,听不清楚,有可能被别人冒充的人通信,来篡改自己的退税信息,来谋划政变,同时,还要将电话费降到最低。

  而编码学家则是一群认为 Alice 没疯的人。

信息(Information)

  编码学家关心的另一件事是信息。没有别的东西像信息一样独特:它可以被凭空创造,也可以被彻底销毁。你可以窃取它,而且是在不使其离开原位的前提下。有时候你仅凭猜测就可以得到它的一部分(比如,即使我不知道你的手机号,我也知道它的第一位是1——译者注)。然而它可以具有很大的价值,可以被买卖。

  有一种信息被称作金钱。

  有一群人不承认金钱可以创造或销毁,他们花费毕生精力维护精确的记录,只为确保:只要一点点钱离开某处,一定有等量的钱出现在另一处。我们称这些人为会计。

信源编码、信道编码和加密编码

  编码理论,就像高卢(地名——译者注)一样,被分为三个部分:信源编码、信道编码和加密编码。

信源编码(Source coding)

  首先聊聊信源编码。这是 Alice 用来省电话费的办法。它经常被用于做数据压缩,即缩短信息的长度。

  有个故事,关于一位信息论的学生在大学的第一天。那一天他进入了一个古怪的世界。他唯一能听到的,就是时不时地,一位教授说出一个数字,和随之而来的笑声。比如一位教授说出“52”,然后是短暂的安静,然后就是响亮的笑声了。又有人说出“713”,结果大家都快笑趴下了。
  “这是什么鬼?”这位学生满脸狐疑地问他的导师。
  “我们在讲笑话,”他的导师说。
  “讲笑话?”
  “对的。你看,我们都在这里工作很久了,每个人有什么笑话,我们互相都知道。一共有一千个。作为信息论的专家,我们对笑话们实施了数据压缩。我们为它们赋予了从0到999的编号,这样讲起笑话来非常省时省力。你可以试一试,说一个0到999之间的数字……”

  这学生将信将疑,不过还是试了一下。他轻轻地说出了“477”。
  只有几乎听不见的低语声。
  他看着他的导师,“我做错了什么?”他说。“再试一次,”导师说。
  他照做了。“318”——和刚才一样,几乎鸦雀无声。
  “不对吧,”他说。
  “好吧,”导师说,“一定是你讲的不好笑!”

  然后就是这个故事精彩的结局了。这位学生最终意外取得了戏剧性的成功。他说了一个范围之外的数——“负105”。
  话音落下,起初众人惊诧地说不出话,然后一位教授笑了起来,继而一个接着一个,直到所有人都笑得摇摇晃晃站不稳。

  这是因为他们从来没有听过这个笑话。

信道编码(Channel coding)

  接下来我们谈谈信道编码。这是 Alice 用来克服电话线上的噪声和干扰的办法。其实大部分人已经不自觉地在用信道编码了,他们会在说话的时候把重要的单词拼读出来。这样做增加了冗余性,并且使得收听者可以进行核实。即使有一部分信息在传输途中丢失,缺少的那一点儿也可以根据剩余的部分经推断得以重建。

  在例如军队,航空,警察这样的组织中,有一套专门为此设计的标准的语音字母表。它是“Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,……”于是他们说“Mike”和“November”,比起发音容易混淆的“M”和“N”显然要清楚得多。(我国军队中以“幺、两、拐、勾、洞”等代替“一、二、七、九、零”同理。——译者注)

   Alice 正在向 Bob 说明,她的丈夫 Bob 已经开始怀疑她的股票交易。
  “我必须跟你说说迈克(Mike),”她说的是。然而 Bob 听到的是“我-嘶嘶-和你讲讲-嘶嘶—嘶-克”。
  “你说什么?” Bob 问。“我必须得和你讲讲Mike”,Alice 说。
  “最后一个词我没听见,Alice,” Bob 说,“你能拼一下么?”
  “Mike India Kilo Echo”。
  “我只听见了India Kilo Echo,你说的第一个词是什么?”
  “Mike。”
  “你能拼一下么?”
  “Mike India Kilo Echo”……

  (这个故事的中文版本应该是这样的:
  ——我说的是‘清’,‘清华’的‘清’。
  ——你说什么?什么‘华的清’?前一个字没听见。
  ——‘清华’的‘清’。
  ——我只听见了‘华的清’,第一个字是什么?
  ——‘清’,‘清华’的‘清’……
  由此进入死循环。——译者注)

  事实上我们有很多套这样的语音字母表。比如在此之前的国际标准是“Able,Baker,Charlie……”

  也有基于地名的:Africa,Brazil,Chile,Denmark,England,France,Greenland,Holland,India,Japan,Khazakistan,Lithuania,Morocco,Niger,Oman,Papua,Qatar,Russia,Spain,Tanzania,Uruguay,Venezuela,Westphalia,Yemen,Xanadu,Zambia。

  我个人最喜欢是这个:

  * A for ‘Orses(音同hay for horses,干草喂给马儿——译者注,下同)
  * B for Mutton(beef or mutton,牛肉羊肉)
  * C for Yourself(see for yourself,亲自看)
  * D for Mation(deformation,变形)
  * E for Brick(heave a brick,举起一块砖头)
  * F for Vescence(effervescence,冒泡)
  * G for Police(chief of police,警长)
  * H for Consent(age of consent,承诺年龄)
  * I for Lutin(highfalutin,自大)
  * J for Orange(Jaffa orange,一种水果)
  * K for Teria(cafeteria,自助餐厅)
  * L for Leather(hell for leather,飞快地)
  * M for Sis(emphasis,强调)
  * N for Mation(information,信息)
  * O for A Muse of Fire(莎翁《亨利五世》的开场白)
  * P for Ate(perforate,打孔)
  * Q for A Song(cue for a song,提示歌词)
  * S for Something Else(as for,至于别的事情)
  * T for Two(tea for two,两人份的茶水)
  * U for Mism(euphemism,婉辞)
  * V for La France(Vive La France,法兰西万岁)
  * W for Mism(double euphemism,两个婉辞)
  * X for Breakfast(eggs for breakfast,早餐吃鸡蛋)
  * Y for Lover
  * Z (zee) for yourself

加密编码(Secrecy coding)

  终于到重头戏——加密编码了。加密编码也被称作密码学(Cryptography)。这是 Alice 用来防止税收当局和秘密警察理解她电话的内容的办法。

  密码学家是真正古怪的人,他们脑袋里的想法是“迂回”的。有时候他们把笑话加密。安全机关称这种笑话为“隐秘笑话”,称编写他们的人为“笑话炮制家”。
  一个使常人可以理解、能引人发笑的笑话,在以其原始形式呈现时,被称为“明笑话”(Plainjoke,变自plaintext,指明文——译者注),被加密后则成为了“密笑话”(Cipherjoke or Cryptojoke,变自ciphertext,指密文——译者注)。显而易见,密笑话只有在被解密(Decryption)后才能被常人所理解,这一过程也被一些人称作解释

  面对一个无法理解的密笑话,有三种攻击方法,这是按照笑话分析师(Jokeanalyst,指攻击者——译者注)所掌握的资源进行分类的。首先我们有“唯密笑话攻击”,这种情况下笑话分析师拥有无限多的“据说很好笑”的材料。

  第二种更强,是“已知明笑话攻击”,这种情况下他可以拥有若干组相互对应的“明笑话——密笑话”样本。

  然而最强的攻击情形是“选择密笑话攻击”,这种情况下他有机会要求笑话炮制家解释他们炮制出的密笑话究竟为什么好笑。或者反过来,是“选择明笑话攻击”,要求笑话炮制家根据已知的笑点炮制出密笑话来。(原文此处可能有误,已修改——译者注)

  那些比较弱智的笑话,通常只用很简单的密码加密,比如只把真正引发笑点、抖包袱的那几个字改掉。这种加密方法被称作“结尾跑偏系统”(Deflected Ending System),简称DES。(事实上DES是一种正经的加密标准 Data Encryption Standard,已因易被破解而停用——译者注)

  那些质量很高、很重要的笑话,比如若被外人理解,就会对国家安全构成威胁的,需要加密得更加安全。通常是把情节、场景、结局全都改掉。这种加密方法被称作“特别聪明掩护”(Particularly Klever Coverup),简称 PKC。其中有一种最著名,可以“抵抗严重攻击”(Resists Serious Attack),故被称作 RSA。(事实上 PKC 是 Public Key Cryptosystem,即公钥密码系统,RSA 是一种 PKC 算法,以发明者 Ron Rivest, Adi Shamir 和 Leonard Adleman 命名。比 DES 强。——译者注)

  当然,这里有一个必然的推论:只有极具天赋、聪明非凡的人才能真正理解一个幽默演讲的美妙之处。

标准化(Standardisation)

  考虑到设计一套好的加密机制的难度之大,和相应仪器设备的成本之高,人们正在努力将加密机制标准化。就在我说话的当下,国际标准化组织 ISO 就正在开会讨论这一点。关于加密机制的标准化,现存不少误解,我应要求来详细阐述一下。语言存在的意义在于传达信息,只有在信息发送和接收的双方采用相同的系统时(比如都说英语、或上海话——译者注)这一目的才能达成。换句话说,语言能够精确地完成其任务,正是因为它是标准化的。

   然而,密码学的意义,恰恰相反,是让信息对除特定人以外的所有人都不可理解,换言之,密码学能够精确地完成其任务,正因为它不是标准化的。所以,他们做的事情实际上是,将加密机制的大部分标准化,然后把非标准化的部分集中到一起,即密钥(key)。

  目前为止一切顺利。但是密钥,这非标准化的部分,必须按照标准化的方法“非标准”。并且密钥的管理必须要遵循一定的标准。换言之,密钥应被阐述为这样的部分,它们本身是非标准的,遵循一定的非标准化的标准,必须以标准化的非标准方法来处理,以在非标准化的基础上实现标准化。

  但愿我解释清楚了标准化的问题。(作者绕了半天“标准化”“非标准化”,看起来是在黑 ISO 对加密机制标准化的尝试——译者注)

弱密钥(Weak keys)

  很多加密机制都存在“坏”的密钥。如果你使用了它们,你的加密就会很容易被破解。比如,全零密钥是 DES 的弱密钥。有很多寻找弱密钥的深入研究。数年来越来越多的弱密钥已被发现,所以你必须非常小心地避免使用它们。

  也许更好的想法是去寻找强密钥。恩,为什么不找一个宇宙中最强的密钥呢?(事实上这是显然不可行的——编者注)

  然后我们就可以把所有的标准化都建立在这个最强密钥上了。

处理延迟(Processing delay)

  编码理论并非完美,它有它自己的问题。在介绍信源编码、信道编码和加密编码的同时,通常也要说一说“处理延迟”。这指由于编码、解码的一切过程造成的延迟——这种延迟有时巨大惊人。

(本段落还在翻译中)

当下图景

(本段落还在翻译中)

(未完待续)

浅尝现代前端开发

“Web 前端技术实训课程”感想(一)

在苹果电脑早已全线标配 NVMe 固态硬盘的当下,我看到有些课程还在讲解磁带。教师自然会有一万种理由来辩解这并不是什么“不思进取”,但作为学生还是总觉得不痛快。

在这样的背景下,Web 前端技术实训课程不可不谓激动人心。该课程由清华大学软件学院刘强老师开设,在该校所谓的夏季小学期展开,历时两周半。邀请到来自知名互联网企业的工程师登台讲解,配合独具特色、实践性极强的“大作业”,有望接触到工业界最新潮流,实在是令人期待。

从今开始在这里分享参与该课程的感想,同时也是为了应对其作业——“在个人网站中发布一些个人日志”。

更新 2016-9-26:就这一篇,并没有后续- –

本博客改名称、换域名啦!

nullspace,数学名词,见于线性代数课程中,对应中文“化零空间”、“零空间”、“核空间”等。

null 和 space 两个词同时出现,是不是很有 geek 科技范?

我的博客的新的地址,是 nullspace.cn(白菜价的 .cn 域名←_←),请大家更新收藏夹~

原域名 200404.xyz 将保持使用直到2016年2月。当然新浪云提供的二级域名 200404.sinaapp.com 会一直可用。更新 2016-9-26:已从新浪云迁出,目前放在 Vultr 提供的 VPS 服务器上。

(完)

如何进行算术表达式的求值

问题:对一个形如“(2!)^(cos(0)+(-2))”的算术表达式求值。

最近《数据结构》课程讲到堆栈的应用,碰到了这个经典的问题:数学表达式的求值。

众所周知,双目运算符有中缀式(自然形式)、前缀式(波兰表达式)、后缀式(逆波兰表达式)三种表示方法,其中后两种易于求值(只需顺序扫描一遍即可)。一种典型的想法是,先把中缀式转换为后缀式(如果利用堆栈,大致是线性时间、线性空间),然后对后缀式求值(线性时间)。

但是这种方法看起来只对二元运算符有效。如果出现了一元运算符,比如 “-1”,这里这个表示一元“取反”运算的负号,需要被转化成 “0-1”,变成二元“减法”运算的减号,方可用前缀式或后缀式求值。除了出现在运算数前面,一元运算符还可以出现在运算数后面,比如阶乘。更甚者,一元运算符可以以“函数”的形式出现,引入更多的括号,比如下式:

(2!)^(cos(0)+(-2))

实际上我们可以认为 f(x),fx,xf 是一元运算符的三种形式。

问题:对一个含有一元运算符、二元运算符、括号的自然形式的算术表达式求值。其中一元运算符的形式包括 “sin(233)”、“-233”、“233!”。

本文将给出一种处理以上问题的有效算法。这一算法在表达式的自身形式上进行迭代,近似具有平方(表达式长度 x 运算符个数)的时间复杂度。可改用栈结构避免重复扫描查找括号,可降低时间复杂度,但将需要线性的额外空间。

1 顺序扫描,查找最内层的一对括号(最靠右的“(”和相应的“)”)

2 查找括号内是否有运算符
    2.1 如果有,对括号内的部分进行求值(子问题)
    2.2 如果没有,检查括号左侧是否有函数名
        2.2.1 如果有,求值
        2.2.2 如果没有,去掉括号

3 重复以上步骤,直到找不到任何括号

其中调用了一个子问题:对不含括号的表达式求值。这时候只有 fx 和 xf 两种形式的一元运算符,且识别起来相当容易:与其他运算符相邻的运算符就是一元运算符。可以先将所有一元运算符求值,然后按正常二元运算符表达式的方法求值。

以下是该算法作用于上例的过程。为避免二义性,以 @ 表示“表示数值的负号”,与运算符“-”区分。

(2!)^(cos(0)+(-2))
(2!)^(cos(0)+(@2))
(2!)^(cos(0)+@2)
(2!)^((1)+@2)
(2!)^(1+@2)
最内层 (1+@2)
最内层 @1
(2!)^(@1)
(2!)^@1
最内层 (2!)
最内层 2
(2)^@1
2^@1
最内层 (2^@1)
最内层 0.5
0.5

以下链接是我(/*于一年前←_←*/)按照该算法写的 C 语言程序,它可以处理前置的一元运算符“-”(取负)、后置的一元运算符“!”(阶乘),可以处理十二种函数 {“cos”,”sin”,”tg”,”ctg”,”abs”,”sign”,”sqrt”,”ln”,”sinh”,”cosh”,”tanh”,”coth”},可以处理五种二元运算符 {‘+’, ‘-‘, ‘*’, ‘/’, ‘^’},可以正确处理括号,同时还实现了一部分大数计算。

https://github.com/lizy14/C-assignments/blob/master/expressionCALC.cpp

(完)

清华校园网免流量上网方法综述

“哪些地方的入校流量不计费?”

本文的分类依据是——“哪些地方的入校流量不计费?”

第一类方法:利用 IPv6

目前校园网 IPv6 出入流量是不计费的。这可能是因为基于对 IP 地址进行认证的计费系统尚未升级,也可能是出于政策上对 IPv6 的推广。
这一类方法都要求你有 IPv6 的接入。反正在我宿舍里是可以的,而到了某些教学楼就不行了。

1. 访问 IPv6 站点或 BT 服务

这是唯一不需要在校外做任何部署的方法,缺点是能访问的站点范围十分有限。这也是目前最广为人知的方法。比如大家都知道从北邮人、六度空间下东西不要流量,可以修改 hosts 文件上 YouTube 等。

2. 利用 IPv6 隧道的代理

这也是用的比较多的方法。你需要在校外有代理服务器,然后通过 IPv6 和代理服务器通信。比如我协就有 Shadowsocks 服务开放给大家使用,部署在校外支持 IPv6 的 VPS 上。想自己搞一个的话可移步参考资料[1]。

第二类方法:利用可从校外访问的校内站点

为方便师生,有一些校内常用站点是可以从校外访问的,包括网络学堂、图书馆、清华邮箱等。我相信这些服务器的 IP 是在计费系统的白名单里的。

1. 清华邮箱

这种方法的实时性较差,很难用于在线浏览,可能只能用来下载文件了。当你需要下载一个大文件的时候,第一步,用一个校外的服务器下载指定的文件。第二步,把它作为附件发到自己清华邮箱。第三步,在校内登录邮箱下载这个文件。

由于邮件附件大小有限制,我们需要把文件分段。这个过程是可以自动化的。曾有同学用此法实现了一个 demo,请围观参考资料[2]。

当然,直接支持通过邮箱下载文件的网站也是有的。

2. 网络学堂

网络学堂有个讨论区,讨论区是可以上传自己的文件的。其实和利用清华邮箱差不多,把第二步改成“把它作为附件上传到网络学堂某个课程的讨论区上”就是了。我最近在做这样一个 demo,尚很粗糙,但基本的功能已经可以了。

第三类方法:SSL VPN 系统

SSL VPN 系统允许你在校外访问校内任意 IP,这也是一个流量不计费的地方。可以利用它做代理隧道。

前不久试了一下,在宿舍里开个 FTP 服务器,然后用家里的电脑连上 SSL VPN 往这个 FTP 上传文件。轻松加愉快。

第四类方法:DNS 的 UDP 53 端口

参考资料[3]是北邮一同学的 demo,还放到乌云上了←_← 据说我校 UDP 53 端口也是开放的,可以 DNS tunnel 绕开计费。

参考资料

[1]如何用20G过完一个月. 岳大禹.
[2][脑洞]关于从校内免流量下载文件的实验. 汪芃.
[3][DNS tunnel实例]北京某大学网关计费系统可被绕过. lxj616.

Visual Studio 配置 OGDF 图布局算法库

项目主页:http://www.ogdf.net/

开源 (GNU/GPL),有不错的示例、文档(都是英文的←_←)

主要步骤:下载源码, 编译安装, 配置工程, have fun!

Step1>>下载源码

  • http://www.ogdf.net/doku.php/tech:download
  • Current Release: v. 2015.05 (Baobab) [5.4 MB]

Step2>>编译安装

  • 执行 makeVCXProj.py 脚本:生成 VS 工程 ogdf.vcxproj, coin.vcxproj 和解决方案 ogdf.sln。不需要 cmake,但是……好像需要个 python 解释器
  • 用 VS 打开 ogdf.sln,“生成解决方案”。
  • 你会得到一些 lib、obj 文件。我的在 OGDF\Win32\Debug 目录下

Step3>>配置工程

  • 添加包含目录、库目录
    • 在解决方案管理器中右击你的工程,属性。配置属性>VC++目录:
    • 在“包含目录”中添加 OGDF\include
    • 在“库目录”中添加 ogdf.lib、coin.lib这两个文件所在的目录(上一小步中的 OGDF\Win32\Debug)
    • 也可以将以上路径添加到相应环境变量中
  • 为链接器附加库 ogdf.lib、coin.lib
    • 还在工程属性对话框中,配置属性 > 链接器 > 输入,在“附加依赖项”中添加“ogdf.lib;coin.lib;”。
    • 也可写在源代码文件里,
      #pragma comment(lib,"C:/blablabla/ogdf.lib")
      #pragma comment(lib,"C:/blablabla/coin.lib")

Step4>>hello world

#include 
using namespace ogdf;

int main(){
Graph G;
node a = G.newNode(); 
node b = G.newNode(); 
node c = G.newNode();
G.newEdge(a, b); 
G.newEdge(b, c); 

GraphAttributes GA(G);

FMMMLayout fmmm; 
fmmm.call(GA);

cout << GA.x(a) << ", " << GA.y(a) << "; \n";
cout << GA.x(b) << ", " << GA.y(b) << "; \n";
cout << GA.x(c) << ", " << GA.y(c) << "; \n";
return 0;
}
//代码很丑陋,这只是个hello world,莫吐槽

一次运行的结果:

25, 25;
59, 60;
93, 93;
请按任意键继续. . .

(完)

屏蔽 KMPlayer 自动更新提示

add to hosts: 127.0.0.1 cdn.kmplayer.com

以管理员身份运行记事本,打开 C:\Windows\System32\drivers\etc\hosts 文件,在其中加入一行:

127.0.0.1 cdn.kmplayer.com

即可。在 KMPlayer 3.9.0 测试成功。

该方法可以用于很多软件。如果你想屏蔽自动更新或广告,同时不影响其他在线功能,修改 hosts 文件屏蔽特定域名不失为一个比使用 Windows 防火墙或 360 安全卫士等禁止程序访问网络更好的办法。

需要屏蔽的域名可以用 Wireshark 等截包软件得到。
(完)

同性婚姻合法化之后……?

以下内容为虚构,如有雷同,纯属巧合。

0. 全国人大常委会表决通过了《关于修改〈中华人民共和国婚姻法〉的决定》,修改了“婚姻”的定义,同性婚姻正式在中国合法化。
1. 一时间,社交媒体上充满了 #真爱无敌# 的欢呼声,以及七彩颜色的头像。反对者的声音被淹没在欢呼雀跃的汪洋大海之中。
2. 在舆论狂轰滥炸之下,当地政府终于迫于压力以一纸行政命令取缔玉林狗肉节。
3. 公知们高强度洗脑,使得动物权利的理念深入人心。《中华人民共和国动物保护法》出台,明文禁止吃狗肉。
4. “老汉防卫过当打死流浪狗 行政拘留15日”,消息一出,人人自危,出门遇狗敬礼磕头,敬而远之。
5. 新的《宪法修正案》将宪法第33条第3款“国家尊重和保障人权”修改为“国家尊重和保障人权、狗权”。
6. 随着抚养成本的不断升高,年轻人的生育意愿不断降低。饲养宠物狗的比例大幅攀升,人们希望人狗之间的亲密关系得到法律保护。
7. 《收养法》修订后,法律上,狗可以成为家庭的一员了。狗也需承担相应赡养义务,主要是“在任何情况下都要及时捡回主人扔出的球”。
8. 《婚姻法》再度修改,人兽婚姻合法化。
9. 一时间,社交媒体上充满了 #真爱无敌# 的欢呼声,以及七彩颜色的头像。

(完)

Wikiwand:优雅地访问维基百科

Wikiwand: Wikipedia Reimagined

本文隆重介绍 Wikiwand 这个网站。它的口号是:

Wikipedia Reimagined: A beautiful new interface to the human knowledge

它能够将维基百科的页面重新排版展现给用户,开起来会非常漂亮。

缺陷是它尚并不支持中文维基百科的繁简、地区词处理机制。

下面是它的主页。您可以从它的主页上直接进入词条,或下载它的 App、浏览器插件。
https://www.wikiwand.com/
http://www.wikiwand.com/

您可以用以下链接体验一下效果:
https://www.wikiwand.com/zh/%E6%95%A3%E5%BA%A6

考虑到它在中文社区的知名度尚低,应该还可以愉快地使用一段时间。当做维基百科专门的 Web 代理。你懂的。(完)

C/C++ 判断整数相加是否溢出

算术方法,或者内联汇编判断溢出标志位

方法1:算术方法,根据运算结果判断。
这种判断方法非常直接。

int isAddOverflow1(int x, int y)
{
    int z = x + y;
    if(x > 0 && y > 0 && z < 0)
        return 1;  
    if(x < 0 && y <  0 && z > 0)
        return 1;
    return 0;
}

方法2:从 CPU 读取溢出标志位。
8086 的控制寄存器里的标志寄存器 FLAG 里有个 OF 溢出标志位,如果上一次运算发生溢出,该位会被置 1。使用 jo 指令可依该标志位跳转。
采用内联汇编。以下代码是 VC 的写法。gcc 相应的关键字是 __ASM__。

//compile with MSVC, run on 8086
int isAddOverflow2(int a, int b) {
    __asm {
        mov eax,a
        add eax,b
        jo  overflowed
        xor eax,eax
        jmp no_overflowed
overflowed:
        mov eax,1
no_overflowed:
    }
}

可采用以下程序进行测试:

#include 
int isAddOverflow1(int x, int y);
int isAddOverflow2(int a, int b);
int main() {
    int a,b;
    int samplesA[]={-23333, -1, 0, 1, 2, 2333333};
    int nSamplesA = sizeof(samplesA)/sizeof(int);
    int samplesB[]={233333, 2147483647, -2147483647, -2147483648};
    int nSamplesB = sizeof(samplesB)/sizeof(int);
    for(int iA=0; iA

如有其他方法,欢迎评论补充。本文整理自网上资料。(完)