0

我见过很多在代码中使用二进制数的例子,比如 32,64,128 等等(例如,非常有名的例子 - minecraft)

我想问一下,在 Java / C++ 等高级语言中使用二进制数有什么帮助吗?

我知道汇编,你总是宁愿使用这些,因为在低级语言中,如果你超过寄存器限制,它会使事情变得过于复杂。

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

4

6 回答 6

1

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

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

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

在其他时候,它是表示布尔值(如位掩码)的最紧凑的方式。

最重要的是,其他时候它对于内存目的效率更高(通常是因为用 2 的幂来乘除逻辑非常快,操作系统/硬件/等将使用缓存行/页面大小/等的幂二,因此您最好为您的重要数据结构提供两种大小的强大功能)。

然后,除此之外,其他时候......程序员只是习惯于使用 2 的幂,以至于他们只是这样做,因为这看起来是一个不错的数字。

于 2012-04-27T17:40:41.230 回答
0

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

在 C++ 和 Java 中,这是相当不错的——尤其是在 GUI 应用程序中。您可以拥有一个包含 32 个不同菜单选项的字段(例如可调整大小、可移动、可编辑等),并应用每个选项,而无需经过复杂的值相加。

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

于 2012-04-27T17:49:09.630 回答
0

从您的问题的标题看来,您的意思是,“如果您以二进制形式编写常量,是否会使您的程序更有效率?” 如果这就是你的意思,那么答案肯定是,不。编译器在编译时将所有常量转换为二进制,所以到程序运行时,它没有任何区别。我不知道编译器是否可以比十进制更快地解释二进制常量,但差异肯定是微不足道的。

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

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

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

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

在实践中,(a)差异是如此微不足道,几乎不值得担心;(b) 您通常不知道在低级别发生的所有事情,因此通常很难预测具有预期后果的更改是否会有所帮助或有害。

简而言之:不要打扰。使用问题自然的常数值。

于 2012-04-27T17:53:01.953 回答
0

不,您的代码将以相同的方式运行,无论您使用什么号码。

如果用二进制数表示数字是 2 的幂,例如:2、4、8、16、1024 ......它们通常是由于空间优化而常见的。例如,如果您有一个 8 位指针,它能够指向 256(即 2 的幂)地址,所以如果您使用的地址少于 256,您就是在浪费您的指针......所以通常您分配一个 256 的缓冲区...这同样适用于所有其他 2 数字的幂....

于 2012-04-27T17:40:49.583 回答
0

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

但是,在某些情况下(非常少),不使用二进制数作为数组/结构大小/长度会带来显着的性能优势。这些是您填充缓存的情况,并且因为您正在循环填充缓存的结构,因此每次循环遍历数组/结构时都会发生缓存冲突。这种情况非常罕见,除非您的代码执行速度比理论上的限制要慢得多,否则不应进行预优化。此外,这种情况非常依赖于硬件,并且会因系统而异。

于 2012-04-27T18:37:18.200 回答
0

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

如果您在数组大小中看到它们,它并没有真正提高性能,但通常内存是按 2 的幂分配的。例如,如果您编写char x[100],您可能会获得 128 个分配的字节。

于 2012-04-27T17:37:11.810 回答