Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在不使用任何条件跳转的情况下计算数组中的正项目_Arrays_Y86 - Fatal编程技术网

Arrays 在不使用任何条件跳转的情况下计算数组中的正项目

Arrays 在不使用任何条件跳转的情况下计算数组中的正项目,arrays,y86,Arrays,Y86,我该怎么做 我想我应该做一些类似于计算校验和的事情,但这应该给出最后位的正整数数 编辑:如果我们也不能使用“shift”怎么办 edit2:ISA是如果您使用的是整数类型,则可以保证非负数的msb为0。*因此您需要做的就是依次隔离每个数组元素的msb,然后累加 *这适用于二补、一补和符号大小。如果使用整数类型,则可以保证非负数的msb为0。*因此,只需依次隔离每个数组元素的msb并累加 *这适用于二补、一补和符号大小。我认为使用条件会更有效,但可以循环数组,将符号位相加 您尚未指定语言,因此

我该怎么做

我想我应该做一些类似于计算校验和的事情,但这应该给出最后位的正整数数

编辑:如果我们也不能使用“shift”怎么办


edit2:ISA是

如果您使用的是整数类型,则可以保证非负数的msb为0。*因此您需要做的就是依次隔离每个数组元素的msb,然后累加



*这适用于二补、一补和符号大小。

如果使用整数类型,则可以保证非负数的msb为0。*因此,只需依次隔离每个数组元素的msb并累加



*这适用于二补、一补和符号大小。

我认为使用条件会更有效,但可以循环数组,将符号位相加

您尚未指定语言,因此我将使用伪代码,假设为32位有符号整数:

Set accumulator to 0
For each element in array
    sign = (element bitwise and 0x80000000) logical shift right by 31
    accumulator += sign
positive_count = length of array - accumulator

我认为使用条件会更有效,但您可以在数组中循环,将符号位相加

您尚未指定语言,因此我将使用伪代码,假设为32位有符号整数:

Set accumulator to 0
For each element in array
    sign = (element bitwise and 0x80000000) logical shift right by 31
    accumulator += sign
positive_count = length of array - accumulator

因为我知道您非常关心性能:如果您可以用汇编语言编码,那么对于数组的每个元素,您可以从零减去元素(或者执行一些类似的技巧,如果元素为正,则设置进位标志),然后使用零操作数执行“ADC”指令(或类似的指令)。ADC是几乎所有CPU都提供的指令,它代表“带进位的加法”。它将把操作数加上CPU进位标志的值加到累加器中。因此,如果元素为正,那么从零开始的减法将设置进位标志,这意味着累加器将递增;否则,进位标志将被清除,因此累加器不会增加。我认为它不会比这更快


编辑:噢,还有,投票反对的人请说明你为什么投票反对?因为,你看,如果你不这样做,那么发生的事情就是像我这样的人被迫用他们的赞成票来取消你的反对票。

因为我看到你非常关心性能:如果你能用汇编语言编码,那么对于数组的每个元素,你可以从零中减去元素(或者做一些类似的技巧,如果元素为正数,则设置进位标志),然后使用零操作数执行“ADC”指令(或类似指令)。ADC是几乎所有CPU都提供的指令,它代表“带进位的加法”。它会将操作数加上CPU的进位标志值加到累加器中。因此,如果元素为正,则从零开始的减法将设置进位标志,这意味着累加器将递增;否则,进位标志将被清除,因此累加器将不会递增。我认为它不能再快一点



编辑:噢,还有,投票反对的人请说明你为什么投票反对?因为,你看,如果你不反对,那么会发生的事情是,像我这样的人被迫用他们的赞成票取消你的反对票。

那么你认为我可以用算术移位来隔离msb吗?@bfaskiplar:你可以使用逻辑或arI模拟移位,然后是位掩蔽。如果我们的ISA不支持移位,有没有办法做到这一点?(它只添加、sub、xor和and)是的,很明显这会很棘手。我需要知道诀窍是什么。@bfaskiplar:所谓棘手,我的意思是“可能不可能快速完成”,除非您能告诉我们有关您的指令集的更多信息。那么您认为我可以使用算术移位来隔离msb吗?@bfaskiplar:您可以使用逻辑移位或算术移位,然后使用位掩码。如果我们的ISA不支持移位,有没有办法做到这一点?(它只支持加法、sub、xor和and)是的,很明显这会很棘手。我需要知道这是什么把戏。@bfaskiplar:所谓棘手,我的意思是“可能不可能快速完成”,除非您能告诉我们有关您的指令集的更多信息。它不会更有效。您听说过控制危险或预测失误的跳转如何降低程序性能吗?可能-取决于您运行此操作的处理器。在68HC11和上,分支和增量将以与and、shift和add、dependi相同的周期数运行在内存访问模式下,实际上,在68HC11上,分支运行得更快,因为移位一次只能在一个位上工作一个预测失误会在Y86中额外花费2个周期,考虑到这一点,明智的做法是使用和移位,而不是使用和,分支,递增。它不会更有效。你听说过控制风险或如何管理失误吗预测的跳转会降低程序性能?可能-取决于您在哪个处理器上运行此操作。在68HC11和上,分支和增量将以与和、shift和add相同的周期数运行。实际上,根据内存访问模式,分支在68HC11上运行得更快,因为shift一次只能工作一个位在Y86中,预测需要额外花费2个周期,考虑到这一点,明智的做法是使用和移位而不是分支、递增IMO,反投票比匿名向下投票更糟糕。您的投票应该代表您对问题的评估……IMO,反投票比匿名向下投票更糟糕。您的投票应该代表y我们对这个问题的评估…现在你已经发现这是一个虚构的ISA,这个问题感觉有点做作。我认为答案是你必须依靠条件来解决这个问题。不。这个问题不是做作的。我用y86汇编语言编写代码,想看看我还能优化多少。我清理了几乎一个ll数据危害。但是,该公司