因此,我正在分析一个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;
位移是不是位的旋转。出现的新位全为0。所以这个表达式:
(header.mapper2 >> 4) << 4)
首先清除 4个低位,然后将所有位移回左侧。
例如如果您有类似01010101
的位模式,则右移将首先使位00000101
,然后左移将使之成为01010000
(因此清除最右边的4位)。
如果它[[是旋转位(如您所期望的那样),则实际上实际上是无操作的。