当前位置: 首页 > 面试题库 >

如何制作无分支代码?

朱通
2023-03-14
问题内容

与此答案相关的信息:http://codingdict.com/questions/122892

在上面的答案中,提到了如何通过避免分支来避免分支预测失败。

用户通过替换以下内容进行演示:

if (data[c] >= 128)
{
    sum += data[c];
}

带有:

int t = (data[c] - 128) >> 31;
sum += ~t & data[c];

这两个等效项如何(对于特定数据集,不是严格等效的)?

在类似情况下我可以做哪些一般的事情?是否总是使用>>~


问题答案:

int t = (data[c] - 128) >> 31;

这里的技巧是,如果data[c] >= 128data[c] - 128则为非负数,否则为负数。int当且仅当该数字为负数时,符号位中的最高位为1。
>>是对符号位进行扩展的移位,因此如果过去一直为非负值,则将结果右移31将使 整个
结果为0,如果曾经为负,则将全部为1位(代表-1)。所以t0如果data[c] >= 128,和-1其他。
~t切换这些可能性,所以~t-1如果data[c] >= 1280其它。


x & (-1)总是等于x并且x & 0总是等于0。因此,通过if sum += ~t & data[c]增加,否则增加。sum``0``data[c] < 128``data[c]

这些技巧很多都可以应用于其他地方。0当且仅当一个值大于或等于另一个值时,通常可以应用此技巧以使数字为be
-1否则,并且您可以将其弄乱一些以获得<=<等等。像这样的位旋转是使数学运算无分支的一种常用方法,尽管它不一定总是由相同的运算构建而成。^(xor)和|(or)有时也会起作用。



 类似资料:
  • 我从git上的一个迭代分支中拆出了自己的开发分支,第二天迭代分支上有其他同事合上去的代码,我应该如何更新这些新代码?

  • 有人知道如何使用跨分支的多分支作业中设置的声明性管道来限制并发构建吗? 每当我们为某个阶段设置代理时,就会分配一个新的执行者。这会导致死锁,例如,当您为尽可能多的分支同时触发生成时,您有执行者。不设置代理会导致阶段随机选择执行者,这是不可接受的,因为某些阶段需要在某些代理上运行。。。 经典的方法不起作用: Throttle并发构建插件不适用于多分支 设置属性([disableConcurrentB

  • 有人知道如何在Java代码中实现这个SQL代码吗? 时间格式类似于数据库中的36000,然后在这个sql命令之后是:10:00 我想让这个函数在Java中工作,而不是在SQL中工作。

  • $ git branch 添加-a选项,就可以显示包括远端分支在内的分支清单。 创建分支 $ git branch <branchname> 高级篇 【教程1 操作分支】 1. 建立分支 修改分支的名称 $ git branch -m <oldbranch> <newbranch> 删除分支 $ git branch -d <branchname> 若有未合并到HEAD的提交,则不能删除分支。如果

  • 我不想重命名远程分支,如重命名本地和远程Git存储库的主分支中所述。 如何重命名尚未推送到远程分支的本地分支? 如果您还需要重命名远程分支:如何重命名Git本地和远程分支名称

  • 我已经为我的WebStorm项目指定了eslint配置。但它似乎不适用于代码重新格式化功能。例如,它继续将< code > import { something } from ' something ' 格式化为< code > import { something } from ' something ' 。 有没有办法让WebStom根据eslint配置格式化代码?