为什么要进行两次移位((x >> 4)<< 4)?

问题描述 投票:0回答:1

因此,我正在分析一个Nes-Emulator代码,遇到了我无法理解的这行代码:

nMapperID = ((header.mapper2 >> 4) << 4) | (header.mapper1 >> 4);

为什么header.mapper2向右再向左移动一次。

标题是这个结构:

struct sHeader
{
    char name[4];
    uint8_t prg_rom_chunks;
    uint8_t chr_rom_chunks;
    uint8_t mapper1;
    uint8_t mapper2;
    uint8_t prg_ram_size;
    uint8_t tv_system1;
    uint8_t tv_system2;
    char unused[5];
} header;
c++ emulation bitwise-operators bit-shift
1个回答
2
投票

位移是不是位的旋转。出现的新位全为0。所以这个表达式:

(header.mapper2 >> 4) << 4)

首先清除 4个低位,然后将所有位移回左侧。

例如如果您有类似01010101的位模式,则右移将首先使位00000101,然后左移将使之成为01010000(因此清除最右边的4位)。

如果它[[是旋转位(如您所期望的那样),则实际上实际上是无操作的。

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