我见过this topic here关于约翰卡马克计算平方根的神奇方法,参考这篇文章:http://www.codemaestro.com/reviews/9。这让我很吃惊,我只是没有意识到计算sqrt会如此之快。
我只是想知道电脑游戏用来运行得更快的其他“魔法”例子。
更新: John Carmack不是魔法代码的作者。 This article告诉更多。谢谢@moocha。
答案 0 :(得分:5)
有一本书收集了很多这些“魔术”,可能对你很有意思:The Hacker's Delight。
你有很多技巧,比如钻头等等......(你有几个平方根算法,例如你可以在谷歌书籍版本上看到)
答案 1 :(得分:5)
不完全是数学黑客,但我喜欢Java6中关于 Roman Numerals 的这个:
public class Example {
public static void main(String[] args) {
System.out.println(
MCMLXXVII + XXIV
);
}
}
由于重写规则,会给你expected result(1977 + 24 = 2001 ):
class Transform extends TreeTranslator
,Java编译器的内部类。
Transform
访问源代码中的所有语句,并将名称与罗马数字匹配的每个变量替换为具有相同数值的int文字。
public class Transform extends TreeTranslator {
@Override
public void visitIdent(JCIdent tree) {
String name = tree.getName().toString();
if (isRoman(name)) {
result = make.Literal(numberize(name));
result.pos = tree.pos;
} else {
super.visitIdent(tree);
}
}
}
答案 2 :(得分:4)
我是Bresenham Line的忠实粉丝,但是CORDIC rotator当我的CPU速度较慢时,{{3}}为我启用了各种像素的chicanery。
答案 3 :(得分:3)
我一直对两个与日期有关的经典'魔术'算法留下深刻印象:
一些(未经测试的)代码如下:
import math
def dayOfWeek(dayOfMonth, month, year):
yearOfCentury = year%100
century = year // 100
h = int(dayOfMonth + math.floor(26.0*(month + 1)/10) + yearOfCentury \
+ math.floor(float(yearOfCentury)/4) + math.floor(float(century)/4) \
+ 5*century) % 7
return ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'][h]
def easter(year):
a = year%19
b = year%4
c = year%7
k = int(math.floor(float(year)/100))
p = int(math.floor((13 + 8.0*k)/25))
q = int(math.floor(float(k)/4))
M = (15 - p + k - q)%30
N = (4 + k - q)%7
d = (19*a + M)%30
e = (2*b + 4*c + 6*d + N)%7
day1 = 22 + d + e
if day1 <= 31: return "March %d"%day1
day2 = d + e - 9
if day2 == 26: return "April 19"
if day2 == 25 and (11*M + 11)%30 < 19: return "April 18"
return "April %d"%day2
print dayOfWeek(2, 12, 2008) # 'Tuesday'
print easter(2008) # 'March 23'
答案 4 :(得分:3)
Bit Twiddling Hacks有许多很酷的技巧。
虽然其中有些已经过时了,但迈克尔·阿布拉什(Michael Abrash)对"The Zen of Code Optimization"中的一些技巧感到敬畏。生命游戏的实施令人难以置信。