如何有效地反转MIPS中16位整数的最后7位?

时间:2014-10-20 22:38:06

标签: performance assembly mips

例如,如果我有一个可以表示为01234567的整数,那么我需要将其反转并保留第一位,使其看起来像07654321.我还需要尽可能高效地执行此操作。

我已经在网上找到了这个:

for (x=0;x<8;x++) {
bit = input & 0x01; // get the low bit
output |= bit; // set the low bit in output
input >> 1; // shift to the right for AND mask
output << 1; // move all bits to the left, low bit = 0 now
}

为了实现这一点(加上保留第一位的开头)我写了这个:

    andi $7, $8, 0xC000     #$7: obtain the first two bits that we want to save
    sll $7, $7, 2           #$7: sll to make it possible to later append $7 on to the beginning

Flip:andi $4, $8, 0x03      #$4: bitwiseAND the reference with 0x03 to isolate last two bits
    or $5, $5, $4           #$5: store the bit using bitwiseOR 
    sll $5, $5, 2           #$5: sll $5 to create space for the next two bits to be loaded in 
    srl $8, $8, 2           #$2 slr $8 so the next two bits can be isolated
    addi $13, $13, -1       # decrease counter
    bne $13, $0, Flip       # if $13 is not equal to zero, then branch to start of Flip 

    or $5, $5, $7           # add the saved bit back onto the beginning 
    srl $5, $5, 2           # srl to get rid of the execess zeros at the end

(在这里查看其他问题之后,我意识到我的格式与常规不同 - 这就是我在课堂上的教学方式)

该代码有效,但我正在寻找一种更有效的方法来实现它。任何人都可以就如何改善这一点提供指导吗?

1 个答案:

答案 0 :(得分:2)

使用具有一点逻辑的查找表是一种非常有效的解决方案。像Gene建议的简单表可以工作,或者你可以尝试多个bit hack solutions进行内存/速度权衡(你可能不需要64位,因为你正在使用MIPS)。