首页 > 解决方案 > 无法理解一段代码。c中的按位运算

问题描述

我有以下代码段,无法破译它的作用。

/* 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) );

标签: bit-manipulationbitwise-operators

解决方案


它交换第 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其他(2 或 3)字节,前一个进程未提取的字节。可能还剩下 3 个字节,因为 n 和 m 可以相同。

最后最后一步是将它们重新组合在一起,但是从第 n 个位置提取的字节转移到第 m 个位置,第 m 个字节转移到第 n 个位置,所以它们交换位置。


推荐阅读