在保留其他位的同时交换4位?

时间:2013-09-21 18:46:09

标签: assembly bit-manipulation mips swap bitwise-operators

我在考虑如何交换给定8位数的中间4值时遇到问题 同时保留中间两侧的2位。这是一个图表:

给定一个8位数字| 76543210 |,将2与4和3交换为5.但是,您还必须保留数字7,6,1和0。

这是我正在做的事情的伪代码(这可能比我实际需要做的更复杂;我是按位操作的新手)

mask1 = 00001100
mask2 = 00110000
temp1 = (original number) AND mask1 // Extract only the bits we care about swapping.
temp2 = (original number) AND mask2
temp1 << 2                          // Perform the swap of the inner four bits.
temp2 >> 2
swapped = temp1 OR temp2            // The final swapped number, but the outer digits
                                    //    haven't been preserved.

是否有我要使用的面具或确保外部数字得到的东西 轮班发生后恢复了?

现在我想我可能会把中间的4位数字归零,然后做(原始数字)或交换,但这看起来像是hacky。

感谢您对此提供任何帮助!

1 个答案:

答案 0 :(得分:1)

当您指定temp1和temp2的值时,只有您想要的位(因为您使用了AND运算符)。

但是您的解决方案中缺少一步,您需要将它们与原始值合并在一起。

您需要做的是复制原始值(如果您不想丢失它),删除您正在修改的值(交换),并使用OR运算符放置您的temp1和temp2。

如何从原始值中删除位?使用以下技巧:

temp3 = (origianl number) AND ~(mask1 OR mask2)

〜是否定。