我想将一个加密函数从 C 移植到 Java。该函数必须在恒定时间内运行,因此没有条件分支(并且没有基于 x 的表查找)是允许的。
原来的C代码是:
int x,result;
...
result = (x==7);
...
因此,如果“x==7”,则“结果”设置为 1,否则设置为 0。 “结果”变量随后用于进一步的计算。
我现在正在寻找将其转换为 Java 的最佳方法。由于在 Java 表达式中计算结果为 boolean 值而不是整数,因此必须使用运算符模拟上述内容。
我现在在用
int x,result;
...
result = (1<<(x-7))&1;
...
这对我来说很好,因为我的 x 在 {0,...,15} 范围内。 (请注意,shift 函数仅使用低 5 位,因此当 x 太大时会出现误报。)
表达式将被计算数百万次,因此如果有一个聪明的解决方案,例如只使用 2 个运算符而不是 3 个,这将使整体计算更快。
最佳答案
@Hosch250 指出的最佳选择是三元运算符。我们来看看JIT编译器为这个方法生成的汇编器:
public static int ternary(int x) {
return x == 7 ? 1 : 0;
}
它实际上取决于分支分析。当你的 x具有值(value) 7通常,它是这样编译的:
xor %r11d,%r11d
mov $0x1,%eax
cmp $0x7,%edx
cmovne %r11d,%eax ;*ireturn
; - Test::ternary@11 (line 12)
看到三元被替换为 cmovne 这不是分支指令。
另一方面,如果您通过 7在极少数情况下(例如,每 5000 次调用一次),分支就在这里:
cmp $0x7,%edx
je <slowpath> ;*if_icmpne
; - Test::ternary@3 (line 12)
xor %eax,%eax
现在几乎从不采用分支,所以更快的方法是保持条件,因为 CPU 分支预测器几乎总是正确的。注意 <slowpath>不只是 return 1; ,它还会更新分支配置文件,因此如果模式在程序执行期间发生更改(7 变得更频繁地出现),那么该方法将被重新编译为第一个版本。
一般来说,在这种简单的情况下,不要试图比 JIT 编译器更聪明。
关于java - Java 中 "x==7"到 1(真)或 0(假)的快速恒定时间评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32409358/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build