我想将一个加密函数从C移植到Java.该函数必须在恒定时间内运行,因此不允许使用条件分支(并且不允许基于x的表查找).
原始的C代码是:
int x,result;
...
result = (x==7);
...
Run Code Online (Sandbox Code Playgroud)
因此,如果'x == 7','result'设置为1,否则设置为0.然后将'result'变量用于进一步的计算.
我现在正在寻找将其转换为Java的最佳方法.就像在Java表达式中评估为布尔值而不是整数一样,必须使用运算符来模拟上述情况.
我目前正在使用
int x,result;
...
result = (1<<(x-7))&1;
...
Run Code Online (Sandbox Code Playgroud)
这对我来说很好,因为我的x在{0,...,15}范围内.(请注意,shift函数仅使用低5位,因此当x太大时,您将得到误报.)
表达式将被评估数百万次,因此如果有一个聪明的解决方案只使用2个运算符而不是3个运算符,这将使整体计算更快.