为什么要执行 Bit-shift 两次 ((x >> 4) << 4)?

Why would you perform a Bit-shift twice ((x >> 4) << 4)?

所以我正在分析 Nes-Emulator 代码,我遇到了这行我无法理解的代码:

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

为什么header.mapper2 bit-shifted一次向右然后向左

顺便说一句,header是这个结构:

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;

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

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

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

例如如果你有像 01010101 这样的位模式,右移将首先使位成为 00000101,然后左移将使它成为 01010000(因此清除最右边的 4 位) .

如果它位的旋转(正如您所期望的那样),那么它实际上是一个空操作。