Binary 在代码中使用二进制数是否可以提高性能?

Binary 在代码中使用二进制数是否可以提高性能?,binary,numbers,Binary,Numbers,我已经看到了很多在代码中使用二进制数的例子,比如32,64128等等(例如,非常著名的例子-minecraft) 我想问,在高级语言中使用二进制数作为java/C++帮助什么? 我知道汇编语言,您总是更愿意使用它们,因为在低级语言中,如果超出寄存器限制,就会使事情过于复杂 如果使用二进制数,程序运行会更快/节省更多内存吗?使用它们的原因可能不同,例如位掩码 如果在数组大小中看到它们,则不会真正提高性能,但通常内存是按2的幂分配的。例如,如果你写了charx[100],你可能会得到128个分配字节

我已经看到了很多在代码中使用二进制数的例子,比如32,64128等等(例如,非常著名的例子-minecraft)

我想问,在高级语言中使用二进制数作为java/C++帮助什么?

我知道汇编语言,您总是更愿意使用它们,因为在低级语言中,如果超出寄存器限制,就会使事情过于复杂


如果使用二进制数,程序运行会更快/节省更多内存吗?

使用它们的原因可能不同,例如位掩码

如果在数组大小中看到它们,则不会真正提高性能,但通常内存是按2的幂分配的。例如,如果你写了
charx[100]
,你可能会得到128个分配字节。

与大多数事情一样,“这取决于”

在编译语言中,更好的编译器会推断慢的机器指令有时可以用不同的快的机器指令来完成(但只适用于特殊值,如二的幂)。有时编码人员知道这一点并相应地编程。(例如,乘以二的幂很便宜)

其他时候,算法适用于涉及二次幂的表示(例如,许多分治算法,如快速傅立叶变换或合并排序)

但在其他情况下,它是表示布尔值(如位掩码)的最简洁的方法

除此之外,在其他情况下,它在内存方面的效率更高(通常是因为用二次幂乘法和除法逻辑非常快,OS/hardware/etc将使用二次幂的缓存线/页面大小/etc,因此对于重要的数据结构,最好使用二次幂)


然后,除此之外,其他时间。。程序员非常习惯于使用二的幂,他们之所以这样做,是因为它看起来是一个不错的数字。

不,无论使用什么数字,代码都将以相同的方式运行


如果你说的二进制数是指2的幂,比如:2,4,8,16,1024。。。。通常,由于空间优化,它们很常见。例如,如果您有一个8位指针,它可以指向256个地址(即2的幂),因此如果您使用的地址少于256个,那么您就是在浪费指针。。。。所以通常分配256个缓冲区。。。这同样适用于所有其他两个数字的幂…

在程序中使用两个数字的幂有一些好处。位掩码就是其中的一个应用,主要是因为位运算符(
&
|
等)的速度非常快

<>在C++和java中,这是公平的,尤其是GUI应用程序。您可以有一个包含32个不同菜单选项(如可调整大小、可移动、可编辑等)的字段,并应用每个选项,而无需进行复杂的值相加


就原始加速或任何性能改进而言,这实际上取决于应用程序本身。GUI软件包可能非常庞大,因此在应用菜单/界面选项时,从中获得任何加速都是一个巨大的成功。

从你问题的标题来看,你的意思是,“如果你用二进制编写常量,会使你的程序更有效率吗?”如果这是你的意思,答案是肯定的,不。编译器在编译时将所有常量转换为二进制,所以在程序运行时,它不会产生任何影响。我不知道编译器是否能比十进制更快地解释二进制常量,但差别肯定很小

但你的问题的主体似乎表明你的意思是“使用二进制整数的常数”,而不是用二进制数字来表示它们

在大多数情况下,答案都是否定的。比如说,如果计算机必须将两个数字相加,那么在二进制中添加一个恰好是整数的数字不会比添加一个非整数快多少

乘法运算可能会稍微快一点。有些编译器足够聪明,可以将2的幂乘法转换为位移位操作,而不是硬件乘法,而且位移位通常比乘法快

在汇编语言时代,我经常让数组中的元素的大小为2的幂,这样我就可以用位移位而不是乘法来索引数组。但是在高级语言中,这很难做到,因为你必须做一些研究,以找出你的原语在内存中占用了多少空间,编译器是否在它们之间添加了填充字节,等等。如果你确实向数组元素添加了一些字节,将其填充到2的幂,那么整个数组现在就更大了,因此,您可能会产生额外的页面错误,即操作系统内存不足,必须将数据写入硬盘,然后在需要时将其读回。一个额外的硬盘需要1000多次乘法

在实践中,(a)差别如此微小,几乎不值得担心;(b)你通常不知道在低水平上发生的每件事,因此通常很难预测一个变化及其潜在的影响会有帮助还是有害


简言之:不用麻烦了。使用问题的自然常数。

在大多数情况下,答案几乎总是否定的,没有明显的性能差异

但是,在某些情况下(很少),不使用二进制数表示数组/结构大小/长度会带来显著的性能优势。这些情况都是在填充缓存时发生的,因为在填充缓存的结构上循环时,每次循环通过数组/结构时都会发生缓存冲突。这种情况非常罕见,除非您的代码执行速度比理论限制慢得多,否则不应该进行预优化