java - 返回X的低两个字节交换的结果

标签 java bit-manipulation bit-shift

问题及解决方案:

/** 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
  1. int lower = X & 0x0000ffff = X & 0b00000000000000001111111111111111 = 0b0000000000000000x15 ... x0

  2. int upper = X & 0xffff0000 = X & 0b11111111111111110000000000000000 = 0bx31 ... x160000000000000000

  3. 降低<< 8 = 0b0000000000000000x15 ... x0 << 8 = 0b00000000x15 ... x000000000

  4. 下>> 8 = 0b0000000000000000x15 ... x0>> 8 = 0bssssssss00000000x15子> ... x<子>8

    • (假设X是有符号数,则s是符号位;X为正则为0,X为负则为1)
  5. (下 << 8)| (下>> 8) = 0b00000000x15 ... x000000000 | 0bssssssss00000000x15 ... x8 = 0bssssssssx15 ... x0x15子> ... x8

  6. 0xffff & ((下<< 8) | (下>> 8)) = 0b000000000000000001111111111111111 & 0bssssssssx15 ... x0 x15 ... x8 = 0b00000000000000000x7 ... x0x15 ... x8

  7. 上 | (0xffff & ((下 << 8) | (下 >> 8))) = 0bx31 ... x160000000000000000 | 0b00000000000000000x7 ... x0x15 ... x8 = x31子> ... x16x7 ... x0x15 ... x8

最佳答案

是的,这比必要的更难理解。

我认为这样更容易理解:

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

关于java - 返回X的低两个字节交换的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157810/

相关文章:

c++ - 如何检查数字 0 到 9 在 C++ 中的数字流中是否至少出现过一次?

math - 有没有人试图打破更小一点?

java - Java 中移位到第 64 位

c++ - 为什么当左侧操作数为负值时,左移操作会调用未定义行为?

c# - 如何限制 Ajax 日历上的日期范围?

Java将字符串编码为UCS

java - 使用 jdbi3 启动 Sprinboot 时出现 AbstractMethod 错误

java - JBOSS EAP6.2 说 java.lang.ClassNotFoundException 但 lib 文件夹中有该类

performance - 使用移位和加/减除以常数

c - A/C编译器是否在编译时执行移位操作?