问题和解决方案:
/** Return the result of swapping the two lower-order bytes of X.
* For example, if X is 0x12345678, then swap(X) is 0x12347856. */
static int swapLower(int X) {
/* Solution */
int lower = X & 0x0000ffff;
int upper = X & 0xffff0000;
return upper | (0xffff & ((lower << 8) | (lower >> 8)));
}
我对如何理解解决方案感到困惑。我尝试了解逻辑,但我不理解。
另外,我不知道如何首先提出解决方案!
编辑:
属性:
x & 1 = x
x & 0 = 0
x | 1 = 1
x | 0 = x
int lower = X&amp; 0x0000ffff = X&amp; 0b00000000000000001111111111111111 = 0b0000000000000000x 15 ... x 0
int upper = X&amp; 0xffff0000 = X&amp; 0b11111111111111110000000000000000 = 0bx 31 ... x 16 0000000000000000
更低&lt;&lt; 8 = 0b0000000000000000x 15 ... x 0 &lt;&lt; 8 = 0b00000000x 15 ... x 0 00000000
更低&gt;&gt; 8 = 0b0000000000000000x 15 ... x 0 &gt;&gt; 8 = 0bssssssss00000000x 15 ... x 8
X
是带符号的数字,则s
是符号位;如果X
为正,则为0;如果X
为负则为0 (低于&lt;&lt; 8)| (低于&gt;&gt; 8) = 0b00000000x 15 ... x 0 00000000 | 0bssssssss00000000x 15 ... x 8 = 0bssssssssx 15 ... x 0 x 15 ... x 8
0xffff&amp; ((下&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;&gt; 0bssssssssx 15 ... x 0 x 15 ... x 8 = 0b00000000000000000x 7 ... x 0 x 15 ... x 8
鞋帮| (0xffff&amp;((低于&lt;&lt; 8)|(低&gt;&gt;&gt; 8))) = 0bx 31 ... x 16 0000000000000000 | 0b00000000000000000x 7 ... x 0 x 15 ... x 8 = x 31 ... x 16 x 7 ... x 0 x 15 ... x 8 子>
答案 0 :(得分:2)
是的,这比必要的更难理解。
我认为这更容易理解:
int lowest2 = (X & 0x000000FF) << 8; // lowest byte moved 8 bits left
int nextLowest2 = (X & 0x0000FF00) >> 8; // next lowest byte move 8 bits right
int upper4 = (X & 0xFFFF0000);
return upper4 | lowest2 | nextLowest2;
然后当X = 0x12345678时:
upper4 | lowest2 | nextLowest2 = 0x12340000 | 0x00007800 | 0x00000056;
但是当然,如果你分析你给出的解决方案,你会得到同样的东西:
如果上限和下限定义为:
int lower = X & 0x0000FFFF
int upper = X & 0xffff0000;
然后:
X = 0x12345678
lower = 0x00005678
(lower << 8) = 0x00567800
(lower >> 8) = 0x00000056
((lower << 8) | (lower >> 8)) = 0x00567856
(0xFFFF & ((lower << 8) | (lower >> 8))) = 0x00007856
upper = 0x12340000
upper | (0xffff & ((lower << 8) | (lower >> 8))) = 0x12345678
答案 1 :(得分:0)
给定的解决方案是正确的,但过于复杂,因此比必要时更难理解。以下解决方案更容易理解:
return X & 0xffff0000 | ((X & 0xff00) >> 8) | ((X & 0xff) << 8);
它只是从数字中拉出三个部分并重新排列它们。要理解它,请考虑每个|
- 分离的组件,考虑它选择的数字部分以及该部分在结果中的位置。