我有以下代码段,难以理解其功能。
/* assume 0 <= n <=3 and 0 <= m <=3 */
int n8= n <<3;
int m8 = m <<3;
int n_mask = 0xff << n8;
int m_mask = 0xff << m8; // left bitshifts 255 by the value of m8
int n_byte = ((x & n_mask) >> n8) & 0xff;
int m_byte = ((x & m_mask) >> m8) & 0xff;
int bytes_mask = n_mask | m_mask ;
int leftover = x & ~bytes_mask;
return ( leftover | (n_byte <<m8)| (m_byte << n8) );
它交换第n个和第m个字节。
[开始有两个并行计算,一个序列使用n
,一个序列使用m
,选择第n个和第m个字节,如下所示:
步骤1:0xff << n8
0x000000ff << 0 = 0x000000ff
.. 8 = 0x0000ff00
.. 16 = 0x00ff0000
.. 24 = 0xff000000
步骤2:x & n_mask
x = 0xDDCCBBAA
x & 0x000000ff = 0x000000AA
x & 0x0000ff00 = 0x0000BB00
x & 0x00ff0000 = 0x00CC0000
x & 0xff000000 = 0xDD000000
步骤3:((x & n_mask) >> n8) & 0xff
(注意:& 0xff
是必需的,因为右移可能是算术右移,如果代码使用无符号整数,则不需要)
n = 0: 0x000000AA
1: 0x000000BB
2: 0x000000CC
3: 0x000000DD
因此它提取第n个字节并将其放在整数的底部。
m
完成相同的操作。
leftover
是other(2或3)个字节,前一个过程未提取的字节。可能剩余3个字节,因为n和m可以相同。
最后一步是将所有内容放回原处,但是将从第n个位置提取的字节移至第m个位置,第m个字节移至第n个位置,因此它们切换了位置。