- 论坛徽章:
- 3
|
呵呵. folklore 说得没错,这是等比数列求前N项和的问题.
设1 + 2 + 2 ^ 2 + 2 ^ 3 + 2 ^ 4 + 2 ^ 5 + 2 ^ 6 +... + 2 ^ (n - 1) = S ---- (1)
于是
(1 + 2 + 2 ^ 2 + ... + 2 ^ (n - 1)) * 2 = S * 2 ---- (2)
于是
(2) - (1) = 2 ^ n - 1 = S
===========================================
还可以用二项式定理得出相同的结论, 将下式用二项式定理展开, 即可得出证明:
(1 + 1) ^ n
===========================================
为什么我说这是计算机的基础题目呢? 因为这和2's complement密切相关.
我们知道, 目前的大多数计算机内部表示整数都是使用补码的方式. 让我们回顾一下, 最高位为符号位:
原码:
正整数的原码, 符号位为0, 其余位为其二进制表示.
负整数的原码, 符号位为1, 其余位为其正整数二进制表示.
1's complement, 也就是反码, 其表示方式是:
正整数的反码, 符号位为0, 其余位为其二进制表示.
负整数的反码, 符号位为1, 其余位为其正整数二进制表示按位取反.
2's complement, 也就是补码, 其表示方式是:
正整数的补码, 符号位为0, 其余位为其二进制表示.
负整数的补码, 符号位为1, 其余位为其正整数二进制表示按位取反再 + 1.
比如, 假设我们只有一个字节来表示一个整数, 那么, 我们只有7位来表示"真正的数值", 最高位为符号位.
比如 -3 的补码表示, 应该是:
+3补码表示:
0000 0011
那么-3的补码表示(最高位1, 其余位按位取反 + 1):
1111 1101
正整数二进制表示按位取反(现在, 让我们不再care符号位什么的)意味着什么? 意味着:
1111 1111 ---- 2 ^ 8 - 1 == 2 ^ 7 + 2 ^ 6 + ... + 2 ^ 1 + 2 ^ 0
- 0000 0011 ---- +3
-------------------
1111 1100
意味着, 2 ^ n - 1 - 3. -- 意味着, 我们对一个正整数按位取反, 其实就是 : 2 ^ n - 1 - 这个正整数.
那么, 2 ^ n - 1 - 3 + 1 意味着什么? 意味着 2 ^ n - 3, 也就是说, 我们对一个正整数取反再加一, 其实就是: 2 ^ n - 这个正整数.
我们假设了我们只有一个字节, 因此上面两个"意味"中, n 取 8.
啊哈! 让我们看看! 我们假设一个表盘, 这个表盘一共有256个刻度, 从刻度0开始到刻度255. 那么我顺时针走一步, 意味着数值 + 1. 让我们看看, 255 + 1 == 256, 唔, 似乎我们又回到了表盘的起点? 表盘的起点是什么? 啊, 是0!
于是我们有: 2 ^ 8 - 3 == 0 - 3.
唔, 所以补码表示是怎么得来的, 明白了吗? 我们称256为一个字节的模. 一个负整数的补码, 说白了就是模减去其正整数, 明白了吗? 然后计算机算加减法就可以不再care符号位了.
===========================================
呵呵. LZ挺认真的. LZ看了我的解答估计很想K我罢(弄得高深莫测结果这么简单神马的, 哈哈)? 谁叫你不思考呢... 这高中数学嘛.
老实说, 我觉得LZ 93后, 虽然语文还不太好, 表达叙述没有层次和清晰感什么的, 但还是挺可爱的. 当时出这个题目想要稍微调戏一下LZ, LZ上当了, 哈哈, 开心~ LZ以后可以用这个调戏下00后什么的, 嗯, 主要是一连串的2很双关的说, 哈哈. 这里发现LZ既然如此认真可爱, 那么叔叔我就收回调戏LZ时的话, LZ你不2哈, 是叔叔我2了~
=========================================== |
|