以不寻常但有效的方式做某事

meh*_*mak 7 language-agnostic algorithm performance bit-manipulation

我今天观看了一段视频,视频中的人只是写下来了解一个数字是否均匀:

number/2*2 == number ? true : false ; 
Run Code Online (Sandbox Code Playgroud)

当我回到家里并与之相比时我试过了

number % 2 == 0 ? true : false ; 
Run Code Online (Sandbox Code Playgroud)

第二个更快,然后我改变了第一个:

number>>1<<1 == number ? true : false; 
Run Code Online (Sandbox Code Playgroud)

这次将数字向右移动一次,向左移动速度更快:D性能差异不大,只需0-1秒即可识别1到1000000000之间的所有数字,但我非常喜欢它,并希望听到这样的技巧您.

还有什么 ?=)

和Russell Borogove的另一个想法=)

(number&1) == 0;
Run Code Online (Sandbox Code Playgroud)

结果:

经过的时间和操作:00:00:07.0504033
经过转移操作的时间:00:00:06.4653698
经过Mod操作的时间:00:00:06.8323908

令人惊讶的是,移动两次比我的计算机上的单个和操作更快.

Raf*_*ler 7

麻省理工学院实际上列出了这样的东西,HAKMEM,可以在http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html找到.大多数编程相关的人都是用汇编语言编写的,但据我所知,他们中的一些已经在转换到C http://graphics.stanford.edu/~seander/bithacks.html.

现在进行一个讲座:这些肮脏的技巧可能会更快,但需要花费太长时间才能理解.

大多数计算都不是那么重要,因此需要这样的技巧.在奇数偶数的情况下,number % 2 == 0number/2*2 == number或更清晰,更可读number>>1<<1 == number.也就是说,在正常的应用程序中,您应该始终使用更简单,更标准的选项,因为它将使您的代码更易于理解和维护.

但是,有这样的技巧的用例.特别是在大型数学或科学计算和计算机图形学中,这些技巧可以挽救你的生命.一个很好的例子是John Carmack在Quake 3中的"魔术逆平方根".