例如,如果我有一个可以表示为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
(在这里查看其他问题之后,我意识到我的格式与常规不同 - 这就是我在课堂上的教学方式)
该代码有效,但我正在寻找一种更有效的方法来实现它。任何人都可以就如何改善这一点提供指导吗?
答案 0 :(得分:2)
使用具有一点逻辑的查找表是一种非常有效的解决方案。像Gene建议的简单表可以工作,或者你可以尝试多个bit hack solutions进行内存/速度权衡(你可能不需要64位,因为你正在使用MIPS)。