問題と解決策:
/** 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 下位 = X & 0x0000ffff = X & 0b0000000000000000111111111111111 = 0b0000000000000000x 15 ... x 0
int 上 = X & 0xffff0000 = X & 0b11111111111111110000000000000000 = 0bx 31 ... x 16 0000000000000000
下 << 8 = 0b0000000000000000x 15 ... x 0 << 8 = 0b00000000x 15 ... x 0 00000000
下 >> 8 = 0b0000000000000000x 15 ... x 0 >> 8 = 0bssssssss00000000x 15 ... x 8
X
(が符号付きの数値であると仮定すると、s
は符号ビットです。正の場合は 0、負のX
場合は 1 です)X
(下位 << 8) | (下 >> 8) = 0b00000000x 15 ... x 0 00000000 | 0bssssssss00000000x 15 ... x 8 = 0bssssssssx 15 ... x 0 x 15 ... x 8
0xffff & ((下位 << 8) | (下位 >> 8)) = 0b000000000000000001111111111111111 & 0bssssssssx 15 ... x 0 x 15 ... x 8 = 0b00000000000000000x 7 ... x 0 x 15 ... x 8
アッパー | (0xffff & ((下位 << 8) | (下位 >> 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