麻烦理解一段代码。 c

问题描述 投票:0回答:1
中的按位运算

我有以下代码段,难以理解其功能。

/* 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-manipulation bitwise-operators
1个回答
0
投票

它交换第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完成相同的操作。

leftoverother(2或3)个字节,前一个过程未提取的字节。可能剩余3个字节,因为n和m可以相同。

最后一步是将所有内容放回原处,但是将从第n个位置提取的字节移至第m个位置,第m个字节移至第n个位置,因此它们切换了位置。

© www.soinside.com 2019 - 2024. All rights reserved.