Java 在方法中使用位运算符值得吗?

Java 在方法中使用位运算符值得吗?,java,optimization,bitwise-operators,Java,Optimization,Bitwise Operators,我对Java非常陌生(一般来说,编程方面,我以前的经验是使用ActionScript2.0和一些简单的JavaScript),我正在慢慢地、有条不紊地学习Java:Herbert Schildt的《初学者指南》。这是一本不可思议的书 首先,我终于或多或少地了解了位运算符(我在ActionScript2.0中第一次遇到)的作用,并且对于某些和,它们比其他方法更有效 我的问题是,在一个有很多计算的大型程序中(在本例中是一个庞大的RPG),使用一种使用(比如说)右移来为您执行所有除法/2(或除法/甚至

我对Java非常陌生(一般来说,编程方面,我以前的经验是使用ActionScript2.0和一些简单的JavaScript),我正在慢慢地、有条不紊地学习Java:Herbert Schildt的《初学者指南》。这是一本不可思议的书

首先,我终于或多或少地了解了位运算符(我在ActionScript2.0中第一次遇到)的作用,并且对于某些和,它们比其他方法更有效

我的问题是,在一个有很多计算的大型程序中(在本例中是一个庞大的RPG),使用一种使用(比如说)右移来为您执行所有除法/2(或除法/甚至)的方法是否更有效,或者仅仅使用标准数学运算是否更有效,因为编译器将为您优化所有运算


或者,我问的问题完全错了吗?

像这样的优化只有在您真正需要的时候才应该进行。如果您只是认为代码会运行得更快,那么这可能不值得


通常情况下,编译器可能比您想象的更聪明,并为您进行优化,其他情况下,可能会出现警告,只会让您陷入更深的麻烦。最重要的是(这可能是反对这样做的最大原因),如果它使您的代码难以为未来的开发人员(或您自己)阅读/理解,您可能只会在将来添加更多的反优化,试图围绕原始代码工作。

出于学习目的,您可以跳过以这种方式优化代码。这需要一些经验,否则您可能会在调试代码时遇到问题(我主要是指“这东西到底在干什么?”综合征),现在的编译器足够聪明,可以优化输出代码并以正确的方式处理已知模式。除非您真的需要节省每毫秒或cpu周期,否则请专注于保持代码干净

后者。也就是说,首先以最清晰的方式编写代码,这很可能需要标准的数学运算。让编译器处理剩下的部分

Java运行在VM上,因此它还具有其他有趣的内置优化功能:例如,当程序运行时,VM可以看到哪些代码分支执行得最频繁,并使这些分支更高效

一旦你编写了你的程序,然后使用一个分析工具来测量哪些特定的方法是慢的。一旦您知道了这一点,您就知道要优化哪种代码。例如,您可能会发现从文件中读取配置是最慢的操作,您可以寻找更快的方法。我的直觉是,使用诸如位运算符之类的东西而不是普通的算术,根本不可能发现任何性能优势


祝你好运

通常编译器会进行大量优化。此外,在进行优化之前,您还需要调查瓶颈到底是什么。优化不是瓶颈的东西只会使更多的线程更快地到达真正的瓶颈。查阅约束理论。

你问的问题完全错了。您应该问的问题是“我应该保持代码简单易读,还是使用我认为可以提高其性能的技巧,即使我没有衡量其性能。”答案应该是显而易见的

位运算符有其位置,尤其是在处理需要将大量数据打包到小空间中的二进制文件格式时。知道如何屏蔽字节的高位非常重要,这样就不会意外地对extend进行签名(打印这两个变量以了解我的意思):

但是不要去寻找使用这些操作符的地方,尤其是用来替换像除以2这样的简单任务

首先,我终于或多或少地明白了什么是按位的 操作符(我第一次在ActionScript2.0中遇到)会这样做 对于某些求和,它们比其他方法更有效

不,这是错误的。按位运算有更多的应用程序可以进行您所要求的除法或乘法运算。
您可以高效地使用位掩码作为标志、打包值、以紧凑的方式模拟访问权限,如crytography等。
看到这个了吗
您应该搜索更多的应用程序,而不仅仅是阅读一章,其中说明了移位是如何类似的,并且(可能)比除法更快(不一定像编译器转换为移位那样)

优化有两条规则。1.不要2。(仅限专家)暂时不要。哈哈,可能是重复的,谢谢。在我准备好之前,我可能会尝试并享受一次光荣的失败,或者至少是3次。谢谢你的回答。这正是我想要的,它以一种简单易懂的方式解释了这一点。聪明的技巧很容易给我留下深刻印象,有时我会突然意识到聪明的技巧通常是件坏事。嗨,是的,我在搜索其他用途时读到了一些关于位运算符的其他应用。他们现在有点超出我的理解,没有双关语的意思。分区只是作为一个例子。谢谢你祝我好运,我很感激:)我只会在程序正常运行后才考虑使用分析工具。谢谢你的建议,我怀疑我是否需要节省每一毫秒!它是干净的代码。不管怎样,这就是我喜欢编码的清晰性。我喜欢你的方法。你会在这项业务中有很好的结局:)谢谢你的提示,我在键入时正在查找约束理论。@user1626141:是的,现在在谷歌上搜索它,它看起来不像我想的那样直接相关。真正重要的是,在优化之前首先进行测量,这样你就知道你正在改进关键路径上的东西。仅仅因为可以优化一切,几乎总是浪费时间,或者实际上是可能出现性能问题的根源。然后当然
byte b = (byte)0xDC;
int  i = b & 0xFF;